javascript - Window 对象通过 typeof 对象测试,但 hasOwnProperty 导致错误

标签 javascript

我正在尝试检查弹出窗口 (opened_window = window.open()) 在文档/javascript 加载到弹出窗口之前是否已关闭,因为如果 javascript 还没有加载然后我无法处理子窗口中的 onunload 事件以与父窗口通信并让它知道弹出窗口已关闭。

当我在文档加载之前关闭弹出窗口并从父窗口执行 console.log(opened_window) 时,它显示 opened_window 是一个对象并且包含设置为 true 的属性 closednullopener

所以,我这样做了:

if (opened_window !== null && typeof opened_window === 'object')
{
    if (opened_window.hasOwnProperty('closed') &&
        opened_window.closed === true &&
        opened_window.hasOwnProperty('opener') &&
        opened_window.opener === null)
    {
        opened_window = null;
        // do stuff
    }
}

问题是我收到错误 Uncaught TypeError: undocked_window.hasOwnProperty is not a function。这让我很困惑,因为它已经通过了 typeof opened_window === 'object' 测试,这意味着 opened_window 是一个对象,那么为什么 . hasOwnProperty 然后导致错误?据我了解,.hasOwnProperty 适用于任何对象。

最佳答案

这很奇怪,但并不是所有的对象都继承自Object.prototype

例如:

Object.create(null).hasOwnProperty('foo'); // error

但是你可以借用方法:

Object.prototype.hasOwnProperty.call(Object.create(null), 'foo'); // false

关于javascript - Window 对象通过 typeof 对象测试,但 hasOwnProperty 导致错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36046096/

相关文章:

javascript - jqGrid:列调整大小触发点击事件

javascript - 我如何在每个下拉菜单项的每个类别下输出链接

javascript - 如何将 Cypress 配置为更长时间(或无限期)等待 BaseUrl?

javascript - Jquery 特定选项卡打开 url 而不是选项卡

javascript - 在 Angularjs 中的 Controller 之间使用范围

javascript - 如何在 "Complete page load"和 "after all external script execution"之后调用函数?

javascript - 如何正确传递参数?

javascript - iPhone 上的 Knockout.js 问题 - 下拉列表问题

javascript 使用单个函数显示多个 Highcharts

javascript - for 循环内的延迟不起作用