【问题标题】:I'm having a hard time finding __proto__ of global object "window"我很难找到全局对象“窗口”的 __proto__
【发布时间】:2020-10-03 06:32:37
【问题描述】:

我目前正在使用 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

为什么会这样?

【问题讨论】:

    标签: javascript google-chrome dom prototype global-object


    【解决方案1】:

    因为没有名为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 定义)。


    旁注:你的代码让我对 Chrome 中的 window 的血统感兴趣,所以我写了以下内容。你可能会觉得很有趣:

    const seenBefore = new Set();
    let indent = "";
    let obj = window;
    while (obj) {
        const proto = Object.getPrototypeOf(obj);
        if (seenBefore.has(proto)) { // Paranoia
            console.log("Got something we've seen before; breaking the loop");
            break;
        }
        seenBefore.add(proto);
        console.log(`${indent}${proto?.constructor?.name}`);
        indent += "  ";
        obj = proto;
    }

    在给我的 Chrome 上:

    窗户 窗口属性 事件目标 目的 不明确的

    在 Firefox 上,这给了我一些不同的东西:

    窗户 事件目标 事件目标 目的 不明确的

    【讨论】:

    • 哇...太棒了...有什么方法可以访问“窗口”的来源吗?
    • Google 似乎隐藏了与内置对象相关的本机代码。我不能访问吗?
    • @kwonryul - 我不知道你所说的“窗口的起源”是什么意思。 FWIW,Chrome 是基于 Chromium 项目构建的,该项目是开源的,所以如果你愿意,总是可以了解细节...... :-)
    • 这对我帮助很大。祝你今天过得愉快! :)
    【解决方案2】:

    如果你写 window._ proto _ @console 它会显示

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    • 那很好,可以添加更多的东西,比如有 developer.mozilla.org 供参考
    猜你喜欢
    • 2023-03-25
    • 1970-01-01
    • 2019-10-14
    • 2016-03-22
    • 1970-01-01
    • 2013-02-10
    • 2017-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多