本文实例讲述了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使用原型和原型链实现对象继承的方法详解