4

我在试图回答这个问题时遇到了困难:解释 javascript 中的奇怪行为。在研究过程中,我发现直接分配给宿主对象的事件处理程序呈现出一种奇怪的行为:它们可以作为对象的属性进行访问,但不知何故,它们似乎不是实际的属性。

例如,如果我在全局范围内定义一个变量,它看起来就像 的任何其他属性window

​var foo = "foo";
console.log(Object.getOwnPropertyDescriptor(window, 'foo'));
// Object {value: "foo", writable: true, enumerable: true, configurable: false} 

如果我只是分配给window.foo,或者如果我创建一个隐含的全局(但是 [[Configurable]] 将是true,由于已知原因;当然,这在严格模式下不起作用),我会得到相同的输出。但是,如果我尝试通过分配来添加事件处理程序window.onsomething,我无法读取该属性Object.getOwnPropertyDescriptor(尽管它仍然可以在 下访问window.onsomething):

window.onresize = function onresize(e) {
    console.log('rsz', e);
}
console.log(window.onresize); // function onresize(){...}
console.log(Object.getOwnPropertyDescriptor(window, 'onresize')); // undefined

浏览器如何处理这样分配的事件处理程序?我怀疑这个问题的答案也是另一个问题的答案。

4

2 回答 2

3

window对象是Window构造函数的一个实例,它onresize作为其原型的一部分。

尝试记录window并启用该show own properties only选项。onresize不会出现,因为它继承自Window. 这就是为什么getOwnProperty不选择它的原因,因为它只返回对象拥有的属性的描述符,而不是源自原型链的那些。

于 2012-12-10T22:33:34.557 回答
1

如果您查看MDN 文档getOwnPropertyDescriptor,它只会报告直接在该对象上的属性,而不是在原型链中。

例如,它适用于:

Object.getOwnPropertyDescriptor(window, 'location')

但不适用于:

Object.getOwnPropertyDescriptor(window, 'onresize')

可能是因为onresize在窗口继承的东西上(因此在原型链中),而不是在实际的窗口对象本身上。

于 2012-12-10T22:27:21.213 回答