JavaScript使用原型和原型链实现对象继承的方法详解

  

本文实例讲述了JavaScript使用原型和原型链实现对象继承的方法。分享给大家供大家参考,具体如下:

  

实际上JavaScript并不是一门面向对象的语言,不过JavaScript基于原型链的继承方式,函数式语法,使得编程相当灵活,所以可以利用原型链来实现面向对象的编程。

  

之前对JavaScript一直都是一知半解,这两天看了一下原型链这一块知识,综合练习了一下JavaScript的对象继承方式。

  

以下就是原型链和原型的关系,引用网上的一张图

  

 JavaScript使用原型和原型链实现对象继承的方法详解

  

在Javascript中,每个函数都有一个原型属性原型指向自身的原型,而由这个函数创建的对象也有一个原型属性指向这个原型,而函数的原型是一个对象,所以这个对象也会有一个原型指向自己的原型,这样逐层深入直到对象对象的原型,这样就形成了原型链。

  

<强>——基本继承模式

        函数FatherClass () {   这一点。类型=案盖住?   }   FatherClass.prototype。getTyep=function () {   console.log (this.type);   }   FatherClass.prototype。obj={年龄:35};   函数ChildClass () {   这一点。类型=昂⒆印?   }   ChildClass。原型=FatherClass ();   ChildClass.prototype。方法=function () {   console.log (this.type);   }   var父亲=new FatherClass ();   var的孩子=new ChildClass ();   father.getTyep ();   child.getType ();      之前      

此方法有优点也有缺点,继承的实现很简单,代码简单容易理解,但是子类继承父类的成员变量需要自己重新初始化,相当于父类有多少个成员变量,在子类中还需要重新定义及初始化

        函数FatherClass(类型){   这一点。类型=| |“父亲”;   }   函数ChildClass(类型){   这一点。类型=| |“孩子”;   }   ChildClass。原型=FatherClass ();   ChildClass.prototype。方法=function () {   console.log (this.type);   }   var父亲=new FatherClass (“fatClass”);   var的孩子=new ChildClass (“chilClass”);      之前      

上面这种情况还只是需要初始化名称属性,如果初始化工作不断增加,这种方式是很不方便的。因此就有了下面一种改进的方式。

  

<强>——借用构造函数

        var父母=function(名字){   this.name=名字| |“父”;   };   Parent.prototype。getName=function () {   返回this.name;   };   Parent.prototype。obj={: 1};   var的孩子=function(名字){   Parent.apply(参数);   };   的孩子。原型=父母。原型;   var父母=new父(“myParent”);   var孩子=new (“myChild”);   console.log (parent.getName ());//myParent   console.log (child.getName ());//myChild      之前      

这样我们就只需要在子类构造函数中执行一次父类的构造函数,同时又可以继承父类原型中的属性,这也比较符合原型的初衷,就是把需要复用的内容放在原型中,我们也只是继承了原型中可复用的内容。

  

<强>——临时构造函数模式(圣杯模式)

  

上面借用构造函数模式最后改进的版本还是存在问题,它把父类的原型直接赋值给子类的原型,这就会造成一个问题,就是如果对子类的原型做了修改,那么这个修改同时也会影响到父类的原型,进而影响父类对象,这个肯定不是大家所希望看到的。为了解决这个问题就有了临时构造函数模式。

        var父母=function(名字){   this.name=名字| |“父”;   };   Parent.prototype。getName=function () {   返回this.name;   };   Parent.prototype。obj={: 1};   var的孩子=function(名字){   Parent.apply(参数);   };   var F=新功能(){};   F。原型=父母。原型;   的孩子。原型=new F ();   var父母=new父(“myParent”);   var孩子=new (“myChild”);   console.log (parent.getName ());//myParent   console.log (child.getName ());//myChild      之前      

<强>个人综合模式

  

《》中到圣杯模式就结束了,可是不管上面哪一种方法都有一个不容易被发现的问题。大家可以看到我在“家长”的原型属性中加入了一个obj对象字面量属性,但是一直都没有用。我们在圣杯模式的基础上来看看下面这种情况:

JavaScript使用原型和原型链实现对象继承的方法详解