_proto_
:
所有構(gòu)造器/函數(shù)的proto都指向Function.prototype,它是一個(gè)空函數(shù)(Empty function)
Number.__proto__ === Function.prototype // true
Boolean.__proto__ === Function.prototype // true
String.__proto__ === Function.prototype // true
Object.__proto__ === Function.prototype // true
Function.__proto__ === Function.prototype // true
Array.__proto__ === Function.prototype // true
RegExp.__proto__ === Function.prototype // true
Error.__proto__ === Function.prototype // true
Date.__proto__ === Function.prototype // true
Function本身就是函數(shù),F(xiàn)unction.proto是標(biāo)準(zhǔn)的內(nèi)置對(duì)象Function.prototype郁轻。
console.log(typeof Function.prototype) // function
Function.prototype.proto是標(biāo)準(zhǔn)的內(nèi)置對(duì)象Object.prototype。
console.log(Function.prototype.__proto__ === Object.prototype) // true
Object.prototype是原型鏈的頂端框杜,所有對(duì)象從它繼承了包括toString等等方法和屬性贾节。
Object.prototype.__proto__ === null // true
對(duì)象的
__proto__
指向自己構(gòu)造函數(shù)的prototype。obj.__proto__.__proto__...
的原型鏈由此產(chǎn)生撮抓,包括我們的操作符instanceof
正是通過(guò)探測(cè)
obj.__proto__.__proto__... === Constructor.prototype
來(lái)驗(yàn)證obj是否是Constructor的實(shí)例
prototype:
只有函數(shù)才有prototype屬性.
當(dāng)你創(chuàng)建函數(shù)時(shí)妇斤,JS會(huì)為這個(gè)函數(shù)自動(dòng)添加prototype屬性,值是空對(duì)象丹拯。
Function.prototype和Function.proto都指向Function.prototype站超,這就是雞和蛋的問(wèn)題怎么出現(xiàn)的。
Object.prototype.proto === null乖酬,說(shuō)明原型鏈到Object.prototype終止死相。
Object本身是構(gòu)造函數(shù),繼承了Function.prototype;Function也是對(duì)象咬像,繼承了Object.prototype媳纬。這里就有一個(gè)雞和蛋的問(wèn)題:
Object instanceof Function // true
Function instanceof Object // true
參考:
從proto和prototype來(lái)深入理解JS對(duì)象和原型鏈
JavaScript中proto與prototype的關(guān)系
注意一點(diǎn)双肤,this這個(gè)值在一個(gè)繼承機(jī)制中(原型鏈與),仍然是指向它原本屬于的對(duì)象钮惠,而不是從原型鏈上找到它時(shí),它所屬于的對(duì)象七芭。