组合继承和寄生组合继承的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了组合继承和寄生组合继承的区别相关的知识,希望对你有一定的参考价值。

组合继承

核心思想:使用借用构造函数的技术实现实例属性的继承,使用原型链实现原型属性和方法的继承。

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,拥有name,colors属性,第一次调用
            this.age = age;                       //自定义实例属性
        }

        SubType.prototype = new SuperType();      //构造原型链,继承原型属性和方法
        SubType.prototype.constructor=SubType;
        SubType.prototype.sayAge = function(){     //向原型中添加方法
            alert(this.age);
        };
        
        var instance1 = new SubType("Nicholas", 29);   //第二次调用
        instance1.colors.push("black");
        alert(instance1.colors);  //"red,blue,green,black"
        instance1.sayName();      //"Nicholas";
        instance1.sayAge();       //29
        
       
        var instance2 = new SubType("Greg", 27);
        alert(instance2.colors);  //"red,blue,green"
        instance2.sayName();      //"Greg";
        instance2.sayAge();       //27

  实际上,使用SubType.prototype = new SuperType();SubType将会继承SuperType实例对象的name,colors属性,虽然name没有被创建

delete instance1.name;
alert(instance1.name);       //undefined,new SuperType()中没有传入实参

  因此造成了一个问题,SubType.prototype上会存在不必要的,多余的属性。如name,colors属性同时存在于SubType.prototype和SubType中。

 

寄生组合式继承

核心思想:用借用构造函数技术继承超类型属性,用inheritPrototype方法继承超类型原型的方法。该方法详细内容可查找相关资料。

该方法的好处在于只调用了一次SuperType构造函数,并且SubType.prototype上没有多余的属性。

该方法是引用类型最理想的继承方式。

 

参考书籍:javascript高级程序设计

 

以上是关于组合继承和寄生组合继承的区别的主要内容,如果未能解决你的问题,请参考以下文章

寄生组合继承

Javascript继承6:终极继承者----寄生组合式继承

[js高手之路]寄生组合式继承的优势

JavaScript各种继承方式:寄生组合继承

Javascript 组合继承 原型链继承 寄生继承

[javascript高手之路]寄生组合式继承的优势