首先需要理解组合继承与寄生继承:
组合继承是使用原型链继承共享的属性和方法,通过构造函数继承实例属性。通过在子类通过call改变this环境调用父类,使得子类获取父类的属性(此时只是获取了父类的属性,不能获取父类原型上的方法)。同时将子类的prototype属性指向新建的父类实例(此时子类的prototype为父类新建实例),以实现继承父类prototy上的方法。同时会将子类的prototyp.constructor指向子类以保证子类实例的instanceof方法不会出错。
寄生继承可以简单理解为是对向的浅继承,es5提供create方法可实现。
组合式继承时需要调用两次父类构造函数(红字时以及新建子类实例对象时),事实上我们没必要在上述红字部分时新建父类实例,只需要将子类的prototype属性指向父类的寄生式继承对象即可。此方法高效的原因在于省去了子类的prototype上创建不必要的属性。代码如下:
function SuperType(name){
this.name = name;
this.colors = ["red","blue","green"];
}
SuperType.prototype.sayName = function(){
alert(this.name);
}
function SubType(name,age){
SuperType.call(this,name);//第二次调用SuperType()
this.age = age;
}
SubType.prototype = new SuperType();//第一次调用SuperType()
SubType.prototype.sayAge = function(){
alert(this.age);
}
注意:不能使用子类prototype直接指向父类,如果你直接写 子类.prototype = 父类.prototype,那你对子类的prototype的任何修改都会同时修改父类的prototype。