一种检查对象是否是window.constructor实例的简洁方法

Wit*_*iko 7 html javascript dom javascript-objects

标题基本概括了所有内容.我需要检查一个对象是否是DOM的一个实例:Window接口.如果iframe存在,也window将通过测试window.frames[xyz].

最直观的方式似乎是一个简单的检查实例object instanceof window.constructor.这是一种令人遗憾的事态,有浏览器(如IE6),window.constructor等于undefined.

你会建议什么?总是存在hacky,丑陋和toString依赖的方式/\[object.*window.*\]/i.test(object),但如果可能的话,我宁愿选择一个简单,干净的解决方案.

lon*_*day 6

window对象具有异常属性window,该属性始终指向同一window对象。这将是非常不可能用于其他任何目的复制这种行为,所以你可以使用它作为后备的window.constructor测试:

function isWindow(obj) {
    if (typeof(window.constructor) === 'undefined') {
        return obj instanceof window.constructor;
    } else {
        return obj.window === obj;
    }
}
Run Code Online (Sandbox Code Playgroud)

jsFiddle显示此行为

  • 我发现另一个不一致之处:window.constructor的window.open()instance等于false。似乎不同的DOM实例的DOM:Window接口没有共享相同的指针,这确实很不幸。obj.window === obj`非常可靠,但是我期待为那些支持它的浏览器提供一种不错的标准化方法。 (2认同)