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

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

原型繼承中利用覆蓋原型對象方式添加原型成員時遇到的constructor屬性指向疑問?

原型繼承中利用覆蓋原型對象方式添加原型成員時遇到的constructor屬性指向疑問?

LEATH 2018-09-13 14:13:25
prototype里面已經沒有constructor屬性,然后往它的原型對象里面找到constructor屬性,為何返回的結果不一樣?
查看完整描述

1 回答

?
不負相思意

TA貢獻1777條經驗 獲得超10個贊

感謝題主提了個好問題,讓我自己也總結了一下以前學過的知識點,哈哈,歡迎交流討論

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

以下是我自己的總結

①每個函數都有一個prototype,每個對象(函數也是對象)都有一個__proto__(隱式原型)

②訪問一個對象的屬性的時候,如果對象沒有該基本屬性,則會沿著__proto__鏈往上查找

③對象的__proto__指向創建該對象的原型prototype

④函數是由Function函數創建,所以函數的__proto__指向Function的prototype,而Function.prototype也是一個對象,她的__proto__指向Object.prototype

⑤自定義函數和自定義對象都由function Object(){}函數創建,Object的prototype也是一個特例,她的__proto__屬性指向了null

?例如:??var?p?=?new?Person();
??對象p由Person構造函數創建,所以對象p的__proto__指向Person的prototype

__proto__鏈(原型鏈)

對象p的原型鏈:

p?---->??Person.prototype???----->??Object.prototype???----->??null

函數Person()的原型鏈:

Person()?---->?Function.prototype?---->?Object.prototype?----->??null

1.console.log(Person.constructor)

Person本身是一個函數,它的__proto__指向Function的prototype,它沒有constructor屬性(只有Person的prototype才有constructor屬性),Person的基本屬性沒有constructor屬性,所以它會沿著__proto__(原型鏈)往上查找,所以它的__proto__上一級是Function的prototype,而Function的prototype的constructor屬性指向下面的結果

結果: function Function(){}


2.console.log(Person.prototype)

由于Person.prototype已經被重置為一個空的對象
所以會返回一個對象

結果: Object

但她還是一個對象,所以她還是有__proto__屬性,__proto__的上一級是指向Object.prototype,而Object.prototype里面又有如題主圖中所示的很多屬性


3.console.log(Person.prototype.constructor)

由于Person.prototype已經被重置為一個空的對象,里面沒有constructor屬性,所以她會往上查找該屬性,上面也提到她的__proto__的上一級是指向Object.prototype,而Object.prototype的constructor屬性指向function Object(){}

結果: function Object(){}


有時間再寫詳細一點,歡迎指正錯誤


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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