【问题标题】:A clean way of checking whether an object is an instance of window.constructor一种检查对象是否是 window.constructor 实例的干净方法
【发布时间】:2011-09-07 22:17:23
【问题描述】:

标题几乎说明了一切。我需要检查一个对象是否是 DOM:Window 接口的实例。如果 iframe 存在,window 将通过测试,window.frames[xyz] 也会通过。

最直观的方法似乎是通过object instanceof window.constructor 进行简单的instanceof 检查。有浏览器(如 IE6),其window.constructor 等于undefined,这是一种可悲的情况。

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

【问题讨论】:

  • 您可以找到关于如何在 javascript 中检测对象以及使用每种技术的问题的很好解释。值得一读...http://stackoverflow.com/questions/332422/how-do-i-get-the-name-of-an-objects-type-in-javascript

标签: javascript html dom javascript-objects


【解决方案1】:

window 对象具有不寻常的属性window,它始终指向同一个window 对象。 非常任何其他对象都不太可能复制此行为,因此您可以将其用作window.constructor 测试的后备:

function isWindow(obj) {
    if (typeof(window.constructor) !== 'undefined') {
        return obj instanceof window.constructor;
    } else {
        return obj.window === obj;
    }
}

jsFiddle showing this behaviour

【讨论】:

  • 很好,它确实适用于我可以使用的所有浏览器(IE 7+、Firefox、Chrome)。
  • 我发现了另一个不一致的地方:window.open() instanceof window.constructor 等于 false。似乎不同 DOM 实例的 DOM:Window 接口不共享相同的指针,这确实很不幸。 obj.window === obj 相当可靠,但我期待为那些支持它的浏览器提供一种不错的标准化方式。
  • 我尝试使用非标准化但广泛支持的Function.prototype.name 属性:window.constructor?(obj instanceof window.constructor || (obj.constructor instanceof Function && obj.constructor.name?obj.constructor.name === window.constructor.name:obj.window === obj)):obj.window === obj
  • 为什么如果window.constructorundefined,函数会检查对象是否是它的实例? === 不应该是 !== 吗?
  • @GustvandeWal 是的,应该。固定。
猜你喜欢
  • 2014-10-26
  • 1970-01-01
  • 2011-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多