亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

js中原型prototype被重寫后到底是怎么回事

js中原型prototype被重寫后到底是怎么回事

HUX布斯 2018-09-13 09:13:18
用個例子說明問題:function F(){};var p1 = new F();F.prototype = {};var p2 = new F()console.log(p1.constructor)//Fconsole.log(p2.constructor)//Object在這里原型不是在p1對象實例后重寫了原型對象為空對象,那么應該p1和p2兩個構造函數都輸出Object.為什么p1輸出F?在此感恩各位師兄解惑!
查看完整描述

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 之后,最后的原型鏈大概是下面這個樣子的。

https://img1.sycdn.imooc.com//5bbf08a10001dbcf09890676.jpg

查看完整回答
反對 回復 2018-10-11
  • 1 回答
  • 0 關注
  • 809 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號