面向對象的幾種繼承方式

面向對象的幾種繼承方式

  • prototype是原型,是構造函數的一個屬性,其值是一個對象,被稱爲原型對象。
  • Constructor 是原型對象的一個屬性,其指向這個原型對象的構造函數。
  • 構造函數經過new操做符可新建一個實例對象,實例對象擁有一個__proto__屬性,指向構造函數的原型對象。

每一個對象都有一個私有屬性,__proto__屬性,其指向其構造函數的prototype(原型對象)屬性,這個原型對象也有個本身的__proto__私有屬性指向
其構造函數的prototype原型對象,層層向上,直到一個對象的原型爲null。根據定義,null沒有原型,而且做爲原型鏈中的最後一節。數組

當須要用到一個對象的屬性時,首先會在其屬性上找,找不到會在其原型對象上找,在其原型對象上找不到,會在其原型對象的原型對象上找。app

  1. 原型鏈繼承

將父類的實例做爲子類的原型對象,給子類的原型對象賦值以後須要將原型對象的構造函數從新指回其構造函數
本質是重寫的子類的原型對象,將子類的原型對象指向了父類的實例,因此子類實例的__proto__屬性指向其構造函數的prototype原型對象指向父類的實例對象
父類實例對象的__proto__實例屬性指向父類實例對象的原型對象,父類原型對象的__proto__屬性指向父類的原型對象的構造函數的原型對象Object函數

對象屬性查找規則:this

JavaScript 對象是動態的屬性「包」(指其本身的屬性)。JavaScript 對象有一個指向一個原型對象的鏈。當試圖訪問一個對象的屬性時,它不單單在該對象上搜尋,還會搜尋該對象的原型,以及該對象的原型的原型,依次層層向上搜索,直到找到一個名字匹配的屬性或到達原型鏈的末尾。prototype

當子類原型對象被修改時,會反映到父類的原型對象上code


  1. call繼承

在子類構造函數中,執行父類的構造函數,並用call將父類中的this改變成子類的this,但這種方法只能繼承父類的私有屬性,而且只能繼承私有方法對象

call是Function的方法,對象沒有call方法,與call類似的還有apply方法,一樣也是改變函數內this的指向,call改變this指向後當即執行函數,參數跟在第一個參數後面,可傳多個參數。
apply改變函數內的this指向後不會當即執行函數,而且其第二個參數是一個數組。繼承

  1. 冒充對象繼承(拷貝繼承)

遍歷父類的實例,拷貝父類實例的全部私有方法給子類的實例賦值。ip

function Parent(){   //   >>>父類
  this.x = 100;
}
Parent.prototype.getX = function(){  //  >>>給父類的原型對象添加方法
  console.log('getX')
}

function Child(){                      //>>>子類,在子類中新建一個父類的實例,循環拷貝父類實例上的屬性和方法

  var p = new Parent();
  for(var attr in p){//for in 能夠遍歷到原型上的公有自定義屬性
      this[attr] = p[attr]
  }
  //如下代碼是隻得到到私有方法和屬性,若是不加這個的話就能夠遍歷到全部方法和屬性
  /*if(e.hasOwnProperty(attr)){
      this[attr] = e[attr]
  }
  e.propertyIsEnumerable()*///可枚舉屬性==>  能夠拿出來一一列舉的屬性
}
var p = new Parent();
var c = new Child();
console.dir(c)
  1. 混合繼承原型鏈

  2. 組合繼承

  3. 寄生組合繼承

相關文章
相關標籤/搜索