JS寄生組合式繼承

JS的繼承方式有很多種,最理想的繼承方式是寄生組合式繼承。
組合繼承(構造函數和原型的組合)會調用兩次父類構造函數的代碼,

function Person(name){
  this.name=name;
}
Person.prototype.sayName=function(){
  console.log(this.name+' '+this.gender+' '+this.age);
}
function Female(name,gender,age){
  Person.call(this,name);//第一次調用父類構造函數             
  this.age=age;
  this.gender=gender;
}
Female.prototype=new Person();//第一次調用父類構造函數
Female.prototype.constrcutor=Female;//因重寫原型而失去constructor屬性,所以要對constrcutor重新賦值

因此引入寄生組合式繼承,即通過借用構造函數來繼承屬性,通過原型鏈的方式來繼承方法,而不需要為子類指定原型而調用父類的構造函數,我們需要拿到的僅僅是父類原型的一個副本。因此可以通過傳入子類和父類的構造函數作為參數,首先創建父類原型的一個復本,并為其添加constrcutor,最后賦給子類的原型。這樣避免了調用兩次父類的構造函數,為其創建多余的屬性。

function inheritPrototype(Female,Person){ 
  var protoType=Object.create(Person.prototype);
  protoType.constructor=Female;
  Female.prototype=protoType;
}
//取代
//Female.prototype=new Person();
//Female.prototype.constrcutor=Female
inheritPrototype(Female,Person);
Female.prototype.sayAge=function(){
console.log(this.name+' '+this.age);
}
 var fm=new Female('skila','female',19);
 fm.sayName();//skila female 19
 fm.sayAge();skila  19
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 博客內容:什么是面向對象為什么要面向對象面向對象編程的特性和原則理解對象屬性創建對象繼承 什么是面向對象 面向對象...
    _Dot912閱讀 1,447評論 3 12
  • 我們在對象創建模式中討論過,對象創建的模式就是定義對象模板的方式。有了模板以后,我們就可以輕松地創建多個結構相同的...
    csRyan閱讀 907評論 0 7
  • 原文鏈接 js的繼承有6種方式,大致總結一下它們各自的優缺點,以及它們之間的關系。 1.原型鏈 js的繼承機制不同...
    空_城__閱讀 800評論 0 11
  • 繼承 Javascript中繼承都基于兩種方式:1.通過原型鏈繼承,通過修改子類原型的指向,使得子類實例通過原型鏈...
    LeoCong閱讀 336評論 0 0
  • Message Message定義了一個可發送給Handler的包含任意對象的消息。注意事項:雖然Message包...
    小賤嘎嘎閱讀 306評論 0 0