對象.原型鏈、函數.原型對象之間的關係只要想明白這四點,就通透了。函數
哪四點呢?post
1. 對象中,有個__proto__屬性,prototype
原型鏈的實現就是經過該屬性;cdn
2. 函數中,有個prototype屬性,對象
這個屬性是個對象,叫作原型對象;blog
3. 對象是由對應的構造函數new出來的,原型鏈
因此, 對象的__proto__會指向構造函數的prototype屬性;get
4. 函數也是個對象,是由Function函數new出來的,原型
因此,函數的__proto__會指向Fuction的prototype屬性;it
另外, 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正好都在鏈上,因此就造就了上述的神奇表達式。
參考: