淺談JavaScript原型及原型鏈

筱葭發表於2017-03-12

1、原型

每個函式都有一個prototype(原型)屬性,這個屬性是一個指標,指向一個物件,這個物件的用途是包含所有例項共享的屬性和方法。Prototype就是通過呼叫建構函式而建立的那個物件例項的原型物件。使用原型物件的好處是可以讓所有例項共享它所包含的屬性和方法。


2、原型鏈

原型鏈是實現繼承的主要方法。其基本思想是利用原型讓一個引用型別繼承另一個引用型別的屬性和方法。

建構函式、原型和例項的關係:

① 建構函式有一個原型屬性prototype指向一個原型物件。

② 原型物件包含一個指向建構函式的指標constructor。

③ 例項包含一個指向原型物件的內部指標[[prototype]] 。

假如讓原型物件等於另一個型別的例項,則此時的原型物件包含一個指向另一個原型物件的指標,相應地,另一個原型物件中也包含著一個指向另一個建構函式的指標。假如另一個原型又是另一個型別的例項,那麼上述關係依然成立,如此層層遞進,就構成了例項與原型的鏈條,這就是所謂的原型鏈的基本概念。 

簡單理解:

JavaScript在建立物件時,不論是普通物件還是函式物件,都有一個叫做__proto__的內建屬性,用於指向建立它的函式物件的原型物件prototype。

以Student類繼承Person類為例(student為Student類的例項,person為Person類的例項):

① student物件有__proto__屬性,它指向建立它的函式物件person的prototype。

  • student.__proto__ === person.prototype

② person.prototype物件也有__proto__屬性,它指向建立它的函式物件Object的prototype。

  • person.prototype.__proto__ === Object.prototype

③  Object.prototype物件也有__proto__屬性,但它較特殊,為null。

  • Object.prototype.__proto__ === null

由__proto__串起來的直到Object.prototype.__proto__為null的鏈,叫原型鏈。

相關文章