簡體   English   中英

為什么{} __ proto__ instanceof!== Object

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM