JS繼承方式

JS繼承的方式

構造繼承

基本思想:

經過使用call,apply方法能夠在新建立的對象上執行構造函數,用弗雷的構造函數來增長子類的實例javascript

優勢:簡單明瞭,直接繼承超類構造函數的屬性和方法java

缺點:沒法繼承原型鏈上的屬性和方法app

【約定】:函數

// 父類
function Super(){
  this.property = 'Super Property'
}
Super.prototype.getProperty = function(){
  return this.property
}

  

// 子類
function Sub(){
  Super.call(this)
  this.property = 'Sub Property'
}

  

原型鏈繼承

基本思想:

利用原型鏈來實現繼承,超類的一個實例做爲子類的原型this

  

// 子類
function Sub(){
  this.property = 'Sub Property'
}
Sub.prototype = new Super()
// 注意這裏new Super()生成的超類對象並無constructor屬性,故需添加上
Sub.prototype.constructor = Sub

  

優勢:簡單明瞭容易實現。實例是子類的實例,實際上也是父類的一個實例。父類新增原型方法屬性,子類都能繼承訪問prototype

缺點:全部子類的實例的原型都共享同一個超類實例的屬性和方法對象

沒法實現多繼承blog

組合繼承

基本思想

利用構造函數和原型鏈組合繼承

// 子類
function Sub(){
  Super.call(this)
  this.property = 'Sub Property'
}
Sub.prototype = new Super()
// 注意這裏new Super()生成的超類對象並無constructor屬性,故需添加上
Sub.prototype.constructor = Sub

  

優勢:解決了構造繼承和原型鏈繼承的兩個問題ip

缺點:實際上子類會擁有超類的兩份屬性,只是子類的屬性覆蓋了超類的屬性

原型式繼承

基本思想

採用原型式繼承並不須要定義一個類,傳入參數obj生成一個繼承obj對象的對象

function objectCreate(obj){
  function F(){}
  F.prototype = obj
  return new F()
}

  

優勢:直接經過對象生成一個繼承該對象的對象

缺點:不是類式繼承,而是原型式基礎,缺乏了類的概念

相關文章
相關標籤/搜索