1 回答

TA貢獻1777條經(jīng)驗 獲得超10個贊
感謝題主提了個好問題,讓我自己也總結(jié)了一下以前學過的知識點,哈哈,歡迎交流討論
以下是我自己的總結(jié)
①每個函數(shù)都有一個prototype,每個對象(函數(shù)也是對象)都有一個__proto__(隱式原型)
②訪問一個對象的屬性的時候,如果對象沒有該基本屬性,則會沿著__proto__鏈往上查找
③對象的__proto__指向創(chuàng)建該對象的原型prototype
④函數(shù)是由Function函數(shù)創(chuàng)建,所以函數(shù)的__proto__指向Function的prototype,而Function.prototype也是一個對象,她的__proto__指向Object.prototype
⑤自定義函數(shù)和自定義對象都由function Object(){}函數(shù)創(chuàng)建,Object的prototype也是一個特例,她的__proto__屬性指向了null
?例如:??var?p?=?new?Person(); ??對象p由Person構造函數(shù)創(chuàng)建,所以對象p的__proto__指向Person的prototype
__proto__鏈(原型鏈)
對象p的原型鏈:
p?---->??Person.prototype???----->??Object.prototype???----->??null
函數(shù)Person()的原型鏈:
Person()?---->?Function.prototype?---->?Object.prototype?----->??null
1.console.log(Person.constructor)
Person本身是一個函數(shù),它的__proto__指向Function的prototype,它沒有constructor屬性(只有Person的prototype才有constructor屬性),Person的基本屬性沒有constructor屬性,所以它會沿著__proto__(原型鏈)往上查找,所以它的__proto__上一級是Function的prototype,而Function的prototype的constructor屬性指向下面的結(jié)果
結(jié)果: function Function(){}
2.console.log(Person.prototype)
由于Person.prototype已經(jīng)被重置為一個空的對象
所以會返回一個對象
結(jié)果: Object
但她還是一個對象,所以她還是有__proto__屬性,__proto__的上一級是指向Object.prototype,而Object.prototype里面又有如題主圖中所示的很多屬性
3.console.log(Person.prototype.constructor)
由于Person.prototype已經(jīng)被重置為一個空的對象,里面沒有constructor屬性,所以她會往上查找該屬性,上面也提到她的__proto__的上一級是指向Object.prototype,而Object.prototype的constructor屬性指向function Object(){}
結(jié)果: function Object(){}
有時間再寫詳細一點,歡迎指正錯誤
添加回答
舉報