在JavaScript中,按照對(duì)象屬性的訪(fǎng)問(wèn)特性,Object對(duì)象中存在兩種類(lèi)型的屬性:
1.共有屬性,對(duì)象實(shí)例共有的屬性,所有對(duì)象實(shí)例都可用,可以從原型鏈上查找的屬性,可被for in或者Object.keys枚舉到
2.自有屬性,對(duì)象實(shí)例私有的屬性,只有該對(duì)象實(shí)例可用,不可從原型鏈上查找的屬性,不可被for in或者Object.keys枚舉到
可以看到,其實(shí),Object本身也是一個(gè)對(duì)象,那么它是誰(shuí)的實(shí)例呢?是的,沒(méi)錯(cuò),它就是Function的一個(gè)實(shí)例。
所以其實(shí)可以看到下面兩段這樣的代碼的執(zhí)行結(jié)果:
Object instanceof Function //true
Function instanceof Object //true
作為一個(gè)對(duì)象,那么當(dāng)然它可以作為下面API的一個(gè)參數(shù),當(dāng)然Object下有prototype屬性,于是:
Object.getOwnPropertyDescriptor(Object,"prototype"),結(jié)果是什么呢?
屏蔽proto以及value,可以看到
configurable: false
enumerable: false
writable: false
這樣的執(zhí)行結(jié)果,那么這說(shuō)明了該屬性不可被刪除,不可被枚舉,不可被修改。
這也就是說(shuō)當(dāng)我們?cè)噲D賦值給Object.prototype時(shí),該操作是無(wú)效的,因?yàn)樗豢杀恍薷摹?/p>
現(xiàn)在來(lái)談?wù)凧avaScript對(duì)象的數(shù)據(jù)屬性和訪(fǎng)問(wèn)器屬性
proto就是一個(gè)訪(fǎng)問(wèn)器屬性,獲取該屬性的值時(shí)通過(guò)調(diào)用getter去獲取,修改該屬性的值時(shí)通過(guò)調(diào)用setter來(lái)修改,換句話(huà)來(lái)說(shuō),我們是無(wú)法直接操作proto的,操作時(shí)內(nèi)部實(shí)際都是通過(guò)這樣的方式在內(nèi)部操作的,只是對(duì)外屏蔽了內(nèi)部操作實(shí)現(xiàn),只對(duì)外提供了操作的方式,僅此而已。
而且通過(guò)Object.getOwnPropertyDescriptor(Object,"proto")查看屬性描述符沒(méi)有任何結(jié)果返回