JavaScript中的原型和原型鏈
1.prototype
我們建立的每一個函式都有一個prototype(原型)屬性,這個屬性是一個指標,指向了一個物件,而這個物件的用途就是包含可以由特定型別的所有例項共享的屬性和方法。
好處:使用原型的好處就是可以讓所有的物件例項共享原型物件所包含的屬性和方法。
1. 無論什麼時候,主要建立了一個新函式,就會根據一組特殊的規則為該函式建立一個prototype屬性,這個屬性指向函式的原型物件。在預設情況下,所有的原型物件都會自動獲得一個constructor(建構函式)屬性,這個屬性是一個指向prototype屬性所在函式的指標。對於上例,Person.prototype.constructor指向Person。
2. 建立了自定義的原型函式之後,其原型物件預設只會獲得constructor屬性,至於其他方法,都是從Object繼承而來的。
3.當呼叫建構函式建立一個新例項之後,其例項內部將包含一個指標(內部屬性)[[Prototype]]指向建構函式的原型物件。
圖示:
補充:
1.Person.prototype指向了原型物件
2.Person.prototype.constructor指向Person
3.預設建立一個新函式,它的原型物件只包含constructor屬性,但在上例中,後來又添加了其他屬性。
4.Person物件的例項的內部屬性僅僅指向Person.prototype
二.__proto__
所有的物件都具有__proto__(隱式原型),指向構造該物件的建構函式的原型物件。
如以下:
(3)原型鏈
當為物件例項新增一個屬性的時候,這個屬性會遮蔽掉原型物件中的同名物件。即使將這個屬性的值設定為null,也只會在例項中設定這個屬性,不會恢復其指向原型的連線。不過,使用delete可以完全刪除例項屬性,從而讓我們恢復訪問原型中的屬性。