我目前正在使用Chrome。
console.log(window.__proto__.__proto__.__proto__);
console.log(window.__proto__.__proto__.__proto__ === EventTarget.prototype);
我发现上面的第一个代码返回EventTarget.prototype
这可以通过第二个代码验证,该代码返回“ true”
此外,以下代码也返回true:
console.log(EventTarget.prototype.__proto__ === Object.prototype);
但是,当您跟踪EventTarget.prototype的孩子是谁时,就会出现问题。
console.log(window.__proto__.__proto__);
上面的代码返回如下。
WindowProperties {Symbol(Symbol.toStringTag):“ WindowProperties” .....}
[当我尝试跟踪构造函数“ WindowProperties()”或对象“ WindowProperties.prototype”时,
控制台说
未捕获的ReferenceError:未定义WindowProperties 在:1:13
为什么会这样?
因为没有公开给您代码的内置全局名称WindowsProperties
。仅仅因为某物存在并具有名称并不意味着您的代码可以访问它。例如:
const example = (() => {
return new class Something { };
})();
console.log(example.__proto__.constructor.name); // Something
console.log(Something); // ReferenceError: Something is not defined
注意:我在上面的代码中使用了__proto__
,因此它会与您的代码紧密地映射,但是我建议从不在实际代码中使用__proto__
。请改用Object.getPrototypeOf
(如果不可避免,请使用Object.setPrototypeOf
)。 __proto__
是仅在浏览器中定义的不推荐使用的功能,并非所有对象都具有此功能(尽管几乎所有对象都具有此功能;它由Object.prototype
定义)。