js繼承方式

類式繼承

function SuperClass(){
  this.superValue = 'superValue';
  this.langs = ['js','html'];
}

SuperClass.prototype.getSuperValue = function(){
  return this.superValue;
}
function SubClass(){
  this.subValue = 'subValue';
}

SubClass.prototype = new SuperClass(); 
SubClass.prototype.getSubValue = function(){
  return this.subValue;
}

缺點:   1.父類構(gòu)造函數(shù)中的引用類型會被子類實例共享
        2.子類實例化過程中不能將參數(shù)傳給父類構(gòu)造函數(shù)

構(gòu)造函數(shù)繼承

function SuperClass(name){
  this.superValue = 'superValue';
  this.langs = ['js','html'];
  this.name = name || 'super';
}

SuperClass.prototype.getSuperValue = function(){
  return this.superValue;
}
function SubClass(name){
  this.subValue = 'subValue';
  SuperClass.call(this,name);
}

SubClass.prototype.getSubValue = function(){
  return this.subValue;
}
優(yōu)點: 子類實例化過程中可傳參給父類構(gòu)造函數(shù)
缺點: 子類不能繼承到父類prototype上的屬性

組合繼承

類式繼承 + 構(gòu)造函數(shù)繼承

function SuperClass(name){
  this.superValue = 'superValue';
  this.langs = ['js','html'];
  this.name = name || 'super';
}

SuperClass.prototype.getSuperValue = function(){
  return this.superValue;
}
function SubClass(name){
  this.subValue = 'subValue';
  SuperClass.call(this,name);
}

SubClass.prototype = new SuperClass(); 
SubClass.prototype.getSubValue = function(){
  return this.subValue;
}

優(yōu)點: 1.子類實例中更改繼承的引用類型不會影響到其他子類實例
      2.子類實例化過程中能將參數(shù)傳遞給父類的構(gòu)造函數(shù)

缺點: 子類繼承會調(diào)用兩次父類構(gòu)造函數(shù)(prototype和call)
   

原型式繼承

function inheritObject(o){
  function F(){}
  F.prototype = o;
  return new F();
}
---
var book = {
  name:'langs'
  content:['js','html']
}
var newBook = inheritObject(book);

類似于類式繼承
缺點:同類式繼承
優(yōu)點:可根據(jù)已有對象創(chuàng)建新對象,不必創(chuàng)建自定義的類

寄生式繼承

 var book = {
  name:'langs'
  content:['js','html']
}

function createBook(o){
  var obj =  inheritObject(o);
    //擴展新對象
    obj.getName = function(){
    console.log('name');
  }
  return obj;
}
在原型式繼承的基礎(chǔ)上擴展屬性
優(yōu)缺點同原型式繼承

寄生組合式繼承

寄生式繼承 + 構(gòu)造函數(shù)繼承


function inheritPrototype(subClass,superClass){
  var p = inheritObject(superClass);
  p.constructor = subClass;
  subClass.prototype = p;
}

function SuperClass(value){
  this.superValue = value || 'superValue';
  this.langs = ['js','html'];
}

SuperClass.prototype.getSuperValue = function(){
  return this.superValue;
}
function SubClass(value){
  SuperClass.call(this, value);
}
inheritPrototype(SubClass, SuperClass);
優(yōu)點:1.子類實例中更改繼承的引用類型不會影響到其他子類實例
      2.子類實例化過程中可傳參給父類構(gòu)造函數(shù)
缺點:代碼實現(xiàn)復(fù)雜
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

  • 借用構(gòu)造函數(shù)繼承 原型鏈式繼承(借用原型鏈實現(xiàn)繼承) 組合式繼承 組合式繼承優(yōu)化1 組合式繼承優(yōu)化2 ES6中繼承...
    lxt410725閱讀 372評論 0 1
  • 一.原型鏈繼承 原型鏈繼承主要是通過修改原型中的prototype的指向,從而繼承上級構(gòu)造函數(shù)的公有屬性 兩構(gòu)造函...
    錘子愛砸房子閱讀 1,159評論 0 0
  • 我們在對象創(chuàng)建模式中討論過,對象創(chuàng)建的模式就是定義對象模板的方式。有了模板以后,我們就可以輕松地創(chuàng)建多個結(jié)構(gòu)相同的...
    csRyan閱讀 1,023評論 0 7
  • 1.繼承(接口繼承和實現(xiàn)繼承) 繼承是 OO 語言中的一個最為人津津樂道的概念。許多 OO 語言都支持兩種繼承方式...
    believedream閱讀 1,057評論 0 3
  • 訓(xùn)練前請再確認以下幾點: 1、每周訓(xùn)練4天,每次訓(xùn)練1小時左右; 2、重量選擇6~10RM的偏大負重,每組必須做到...
    熊大狀閱讀 553評論 0 0

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