1 回答

TA貢獻1828條經驗 獲得超3個贊
首先你要明白,F.prototype 是對一個實例對象的引用,這個實例對象在你創建函數 F( ) 的時候同時被生成,如果我們給這個對象起個名字叫做 A,那么我們可以簡單的理解為:A 是一個被存儲在內存中的一個實例對象,而 F.prototype 是指向 A 的一個指針。
同時,A 對象內也有一個指針 constructor ,它指向了函數 F()。
那么當你第一次使用 new F( ) 時,生成了一個新對象 a ,p1 是對象 a 的一個引用(即p是指向a的一個指針),而 a 的 __proto__ 屬性在此時也已經被指向為 A。
即目前,指向對象實例 A 的指針有兩個,分別是 a.__proto__ 和 F.prototype。
之后你對 F.prototype 進行賦值時,實際上改變了 F.prototype 的指向,試他指向了另一個個實例對象{},我們管這個實例對象叫 B 好了,對于這個實例對象 B,它的 constructor 的屬性指向了 Object。
請注意,此時 a 的 __proto__ 的指向并沒有改變,仍是指向了實例對象A。
那么當你第二次調用 new F( ) 的時候,實際上生成了另一個新的實例對象 b, b 的 __proto__ 屬性指向的是 B。
所以在 p1.constructor 的背后其實是相當于:
p1 -> a, a.__proto__ -> A, A.constructor -> F( )。
而在 p2.constructor 的背后則為:
p2 -> b, b.__proto__ -> B, B.constructor -> Object( )
恩,我也給張參考圖吧,第二次 new 之后,最后的原型鏈大概是下面這個樣子的。
添加回答
舉報