码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-05-23 00:25:24      阅读:170      评论:0      收藏:0      [点我收藏+]

标签:

组合继承

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

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高级程序设计

 

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

标签:

原文地址:http://www.cnblogs.com/pick7/p/5518212.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!