對象.原型鏈,函數.原型對象

對象.原型鏈、函數.原型對象之間的關係只要想明白這四點,就通透了。函數


哪四點呢?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正好都在鏈上,因此就造就了上述的神奇表達式。

     


參考:

juejin.im/post/58f9d0…

juejin.im/post/583586…

相關文章
相關標籤/搜索