天天看點

JS的prototype和__proto__

一、prototype和__proto__的概念

prototype是函數的一個屬性(每個函數都有一個prototype屬性),這個屬性是一個指針,指向一個對象。它是顯示修改對象的原型的屬性。

__proto__是一個對象擁有的内置屬性(請注意:prototype是函數的内置屬性,__proto__是對象的内置屬性),是JS内部使用尋找原型鍊的屬性。

用chrome和FF都可以通路到對象的__proto__屬性,IE不可以。

二、new 的過程

new的過程拆分成以下三步:

(1) var p={}; 也就是說,初始化一個對象p

(2) p.__proto__ = Person.prototype;

(3) Person.call(p); 也就是說構造p,也可以稱之為初始化p

關鍵在于第二步,我們來證明一下:

這段代碼會傳回true。說明我們步驟2是正确的。

三、示例

<a target="_blank"></a>

p是一個引用指向Person的對象。我們在Person的原型上定義了一個sayName方法和age屬性,當我們執行p.age時,會先在this的内部查找(也就是構造函數内部),如果沒有找到然後再沿着原型鍊向上追溯。

這裡的向上追溯是怎麼向上的呢?這裡就要使用__proto__屬性來連結到原型(也就是Person.prototype)進行查找。最終在原型上找到了age屬性。

繼續閱讀