組合繼承和寄生組合繼承的區別


組合繼承

核心思想:使用借用構造函數的技術實現實例屬性的繼承,使用原型鏈實現原型屬性和方法的繼承。

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高級程序設計

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM