[英]why {}__proto__ instanceof !== Object
這對我來說沒有意義,請有人解釋它的最后一行:
var o = {};
o.__proto__.isPrototypeOf(Object) // true
o.__proto__.constructor.name // 'Object'
o.__proto__.toString() // '[object Object]'
o.__proto__ instanceof Object // false (wtf???)
讓我重新解釋一下我原來的問題 - 我不是在尋找理解它如何在內部工作但是為什么它以這種方式工作(雖然有時它有所幫助) - 我的意思是:為什么JS引擎構造dunder proto( __proto__
proto __proto__
)AS一個不是實例的對象對象即使它有'構造函數'設置,即使所有對象文字都是對象的實例(例如, o instanceof Object === true
, ({}) instanceof Object === true
)。
換句話說 - 當dunder proto不是手動構建時, WHAT的實例是dunder proto?
為什么它有“構造函數”屬性設置,如果“它不是一個實例”,就像有人寫的那樣? 根據MDN:“所有對象都從其原型繼承構造函數屬性” - 如果dunder proto對象具有構造函數屬性,那么它應該意味着它是從'some'原型繼承的......所以,如果'constructor'屬性對我有意義沒有為'root'dunder proto設置
(我沒有使用dunder proto,因為它被勸阻但昨天我讀了ES6的官方部分,所以我看了一下)
instanceof
做了一些簿記,然后執行HasInstance
“方法”。
HasInstance
定義為:
返回一個布爾值,指示參數是否可能是此對象構造的Object。
由於未構造對象的原型,因此在使用instanceof
時必須始終返回false。 相反,
o instanceof Object
返回true,因為o
是一個實例。
這實際上是如何工作的? 好吧, HasInstance
遍歷它正在檢查的對象的整個prototype
鏈。 但o.__proto__
沒有原型 - 因此它不被視為對象, HasInstance
返回false。
如果你習慣於處理基於類的OOP語言,那么Javascript的OOP(/ FP:P)可能是一個很大的挑戰。 我會向你推薦一些解釋得很好的文章,但遺憾的是,到目前為止我還沒有找到 - 並且閱讀規范可能會讓你更加困惑(這不是那里更好的規范之一)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.