窗口对象通过对象类型测试,但 hasOwnProperty 导致错误

Window object passes typeof object test, but hasOwnProperty causes error

本文关键字:对象 hasOwnProperty 错误 测试 类型 窗口      更新时间:2023-09-26

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

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

所以,我这样做了:

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