紅皮書(shū)繼承小結(jié)

組合繼承

也叫偽經(jīng)典繼承;指將原型鏈和構(gòu)造函數(shù)技術(shù)組合一起的繼承方式

function SuperType(name){
        this.name =name;
        this.colors =["red","blud","green"];
      }
      SuperType.prototype.sayName =function(){
        alert(this.name);
      }
      function SubType(name,age){
        //繼承屬性
        SuperType.call(this,name);   //第二次調(diào)用SuperType()
        this.age =age;
      }
      //繼承方法
      SubType.prototype = new SuperType();  //第一次調(diào)用SuperType()
      SubType.prototype.construcotr = SubType;
      SubType.prototype.sayAge = function() {
        alert(this.age);
      }

      var xyy = new SubType("xyy",21);
      xyy.sayName();  //xyy
      xyy.sayAge();   //21

     var xyy2 = new SubType("xyy2",212);
      xyy.sayName();  //xyy2
      xyy.sayAge();   //212

xyy => SubType => SuperType
SuperType構(gòu)造函數(shù)定義了兩個(gè)屬性:name和colors。SuperType的原型定義了一種方法sayName()。SubType構(gòu)造函數(shù)在調(diào)用SuperType構(gòu)造函數(shù)時(shí)傳入了name參數(shù),也同時(shí)定義了自己的屬性age。然后將SuperType是實(shí)例賦值個(gè)SubType的原型,然后又在新的原型上定義方法sayAge()。這樣就可以讓兩個(gè)不同的SubType實(shí)例分別擁有自己的屬性包括colors屬性,又可以使用相同的方法

不足:
組合繼承最大的不足是,無(wú)論什么情況下,都會(huì)調(diào)用兩次超類(lèi)型構(gòu)造函數(shù),一次是在創(chuàng)建子類(lèi)原型時(shí),第二次是在構(gòu)造函數(shù)內(nèi)部

寄生組合繼承

寄生組合繼承是借用構(gòu)造函數(shù)來(lái)繼承屬性,通過(guò)原型鏈混成形式來(lái)繼承方法

//替換了第一次調(diào)用
function inheritPrototype(subType,superType){
      var prototype=Object.create(superType.prototype); //創(chuàng)建對(duì)象
      prototype.constructor=subType;   //為對(duì)象添加constructor屬性,彌補(bǔ)重寫(xiě)原型而失去的constructor屬性
      subType.prototype=prototype; //將創(chuàng)建的對(duì)象賦值給子類(lèi)的原型
        }
        function SuperType(name){
          this.name =name;
          this.colors =["red","blud","green"];
        }
        SuperType.prototype.sayName =function(){
          alert(this.name);
        }
        function SubType(name,age){
          SuperType.call(this,name);
          this.age =age;
        }
        inheritPrototype(SubType,SuperType);
        SubType.prototype.sayAge=function(){
               alert(this.age);
        };//擴(kuò)展出sayAge方法

var person1=new SubType("nUll",25);
var person2=new SubType("mywei",25);
person1.colors.push("gay3");
person1.sayName();
person1.sayAge();
console.log(person1.colors);    //["red", "blud", "green", "gay3"]
console.log(person2.colors);  //["red", "blud", "green"]
console.log(person1 instanceof SubType);   //true
console.log(person1 instanceof SuperType);  //true
console.log(SubType.prototype.isPrototypeOf(person1));  //true
console.log(SuperType.prototype.isPrototypeOf(person1)); //true
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容