组合继承和寄生继承

340 阅读2分钟

首先需要理解组合继承与寄生继承:

组合继承是使用原型链继承共享的属性和方法,通过构造函数继承实例属性。通过在子类通过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。