2011-11-11 9 views
2

私は、alertとconsole.logがIE8の通常のJavaScriptオブジェクトのように動作しないことに気付きました。誰にもこれについての説明がありますか? http://perfectionkills.com/whats-wrong-with-extending-the-dom/IE8のいくつかの組み込み関数がFunctionのインスタンスではないのはなぜですか?

ECMA-262の第三:こちらを発見

Good: 
escape instanceof Function; // => true 
escape.call;    // => function call() { } 
typeof escape;    // => "function" 
escape.test = 1;   // => 1 

Bad: 
alert instanceof Function; // => false 
alert.call;     // => undefined 
typeof alert;    // => "object" 
alert.constructor;   // => undefined 
alert.test = 1;    // => Object doesn't support this property or method 
+3

ブラウザを実装することができ、そのホストオブジェクトは、しかし、それは好きなので、それはおそらくです。 –

答えて

2

。編:

ホストオブジェクトがどの 実装依存の動作とこれらの内部メソッドを実装することができ、またはそれは、ホストオブジェクト のみいくつかの内部メソッドではなく他人を実装している可能性があります。

内部メソッドの仕様については、[[Get]]、[[Put]]、[[Delete]]などがあります。つまり、[[Get]]メソッドの呼び出しでホストオブジェクトがエラーをスローすることは絶対に普通です。


したがって、IEは仕様に違反していません。動作は一貫しており、JavaScript言語の一部ではない組み込み関数はすべてそのように動作します。それらにプロパティを割り当てることはできません。プロトタイプとコンストラクタはありません。

例:

alert; 
scrollTo; 
document.getElementById; 
location.reload; 
setTimeout; 
関連する問題