首先需要理解组合继承与寄生继承:
组合继承是使用原型链继承共享的属性和方法,通过构造函数继承实例属性。通过在子类通过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);
- }