1 回答

TA貢獻1777條經驗 獲得超10個贊
感謝題主提了個好問題,讓我自己也總結了一下以前學過的知識點,哈哈,歡迎交流討論
以下是我自己的總結
①每個函數都有一個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(){}
有時間再寫詳細一點,歡迎指正錯誤
添加回答
舉報