4

I got stuck trying to answer this question: Explaining odd behavior in javascript. While researching, I found that event handlers assigned directly to host objects present a strange behavior: they can be accessed as properties of the object, but somehow they don't appear to be actual properties.

For example, if I define a variable on the global scope, it looks like any other property of window:

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

I get the same output if I just assign to window.foo, or if I create an implied global (but then [[Configurable]] would be true, for known reasons; and, of course, that wouldn't work on strict mode). However, if I try to add an event handler by assigning to window.onsomething, I can't read that property with Object.getOwnPropertyDescriptor (although it's still accessible under window.onsomething):

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

How do browsers deal with event handlers assigned like that? I suspect the answer to this is also the answer to that other question.

4

2 に答える 2

3

windowオブジェクトはWindowコンストラクターのインスタンスであり、プロトタイプの一部として持っていますonresize

ログに記録して、オプションwindowを有効にしてみてください。から継承されているため、存在しません。これが、プロトタイプチェーンに由来するものではなく、オブジェクトが所有するプロパティの記述子のみを返すため、それを取り上げない理由です。show own properties onlyonresizeWindowgetOwnProperty

于 2012-12-10T22:33:34.557 に答える
1

のMDNドキュメントgetOwnPropertyDescriptorを確認すると、プロトタイプチェーンではなく、そのオブジェクトに直接存在するプロパティのみが報告されます。

たとえば、次の場合に機能します。

Object.getOwnPropertyDescriptor(window, 'location')

ただし、次の場合は対象外です。

Object.getOwnPropertyDescriptor(window, 'onresize')

おそらくonresize、実際のウィンドウオブジェクト自体ではなく、ウィンドウが継承するもの(したがってプロトタイプチェーン内)にあるためです。

于 2012-12-10T22:27:21.213 に答える