物件.原型鏈,函式.原型物件
物件.原型鏈、函式.原型物件之間的關係只要想明白這四點,就通透了。
哪四點呢?
1. 物件中,有個__proto__屬性 ,
原型鏈的實現就是通過該屬性;
2. 函式中,有個prototype屬性 ,
這個屬性是個物件, 叫做原型物件 ;
3. 物件 是由 對應的建構函式new 出來的,
所以, 物件的__proto__會指向建構函式的 prototype屬性 ;
4. 函式也是個物件 ,是由 Function函式new 出來的,
所以,函式的__proto__會指向Fuction的 prototype屬性 ;
另外, Function函式也構造了自己,Fucntion.__proto__ === Function.prototype;
說的多,不如看個圖直觀,看圖的關鍵是把握:
物件被建構函式new出來後, 物件的_proto__ 會指向 建構函式的prototype屬性
用上圖,我們就可以解釋很多神奇的現象了,
1. 原型鏈,也就是__proto__最後都指向了Object.prototype,而該原型物件的__proto__ === null;
2. Function instanceof Object === Object instanceof Fucntion === true;
instanceof通俗的說法是,判斷左邊物件是不是右邊函式new出來的例項;這種說話就會讓上述表示式很矛盾;但是,換個說法,instanceof本質上是用來,判斷 右邊函式的原型物件 是否在 左邊物件的原型鏈 上;
由於Fuction函式和Object函式都是由Function函式new出來的,導致Function.__proto__和Object.__proto__指到一塊去了,而Function.prototype和Object.prototype正好都在鏈上,所以就造就了上述的神奇表示式。
參考: