为什么比较“构造器”?两个Windows的属性不可靠
Why is comparing the ".constructor" property of two windows unreliable?
我正试图理解为什么以下内容不像我认为的那样工作。我想检查一个对象是否是窗口。我想检查当前窗口和另一个窗口的构造函数会起作用。
那么,首先创建另一个窗口:
var popup = window.open('', '', '');
然后检查:
popup.constructor === window.constructor;
但由于某些原因,不同浏览器的结果有所不同:
- IE7:返回
true
- 但这仅仅是因为
.constructor === undefined
false
""
)false
- 虽然在这两种情况下
.constructor === DOMWindow
-但DOMWindow
不能像这样直接访问
false
- 尽管在这两种情况下
.constructor === Object
false
- 尽管在这两种情况下
.constructor === Window
为什么这个不可靠,不能正常工作?jQuery只是检查"setInterval" in window
,但我想创建一个更健壮的函数来检查一个对象是否是一个窗口。
每个单独的window
都是解释器的单独全局上下文(是的,我暂时忽略了IE7)。当你想到instanceof
:
if (something instanceof Array) { ... }
当"something"是在单独的上下文中构造的值时,就会出现问题,例如iframe。每个窗口都有它自己的"Array"构造函数的副本,所以即使一个对象可能是Array实例,它也不是同一个构造函数的实例。
我怀疑IE7的行为与其他一些奇怪的东西有关,我认为就像window.window
不等于window
一样。比如,其中一个实际上是对内部事物的引用。(也许是window
不等于window.self
,即使它们在其他方面的行为相同。我并没有花太多时间去思考IE7。
相关文章:
- 使用作为参数传递的对象创建新对象的构造器
- Javascript 类型错误:oauth 不是构造器
- 使用函数构造器创建 Javascript 异议
- 如何存根猫鼬模型构造器
- 在对象构造器onclick事件中创建的HTML按钮不起作用
- 需要帮助修复由于2个javascript对象具有相同的名称,但不同的构造器引起的问题
- 为什么我得到一个'函数未定义'即使我将函数添加到构造器的原型中
- 位图构造器URL VS图像,如何决定
- 我如何正确地使一个构造器的prototype属性继承它原来的prototype属性?
- 为什么如果构造器的原型改变了,对象的构造器属性也会改变?
- 为什么创建一个名为“构造器”的键似乎改变了“这”的行为
- 使用字符串"构造器"JavaScript对象中的关键字
- 为什么比较“构造器”?两个Windows的属性不可靠
- 使用Javascript构造器进行原型设计
- jQuery对象构造器-方法调用自身
- 在实例模式下使用p5.sound.js: 'p5.Amplitude()不是构造器'
- 通过给定的@decorators获取所有类/构造器
- 不同原型的Javascript对象构造器混淆
- 可以在webOS Enyo框架中使用原生javascript/coffeescript构造器吗?
- 编写构造器的扩展方法的好方法?(请参阅我的尝试)