为什么IE8中的某些内置函数不是Function的实例?

时间:2011-11-11 21:53:19

标签: javascript internet-explorer

我注意到alert和console.log不像IE8中的普通JavaScript对象那样工作。有没有人对此有解释?

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

1 个答案:

答案 0 :(得分:2)

在此处找到:http://perfectionkills.com/whats-wrong-with-extending-the-dom/

ECMA-262第3名。 ED:

  

主机对象可以使用any实现这些内部方法   依赖于实现的行为,或者它可能是宿主对象   只实现了一些内部方法而不是其他方法。

内部方法规范谈论的是[[Get]],[[Put]],[[Delete]]等。注意它是如何表示内部方法行为是依赖于实现的。这意味着主机对象在调用[[Get]]方法时抛出错误是绝对正常的。


所以,IE并没有违反规范。行为是一致的,并且所有不属于JavaScript语言的内置函数都是这样的。您不能为它们分配属性,它们没有原型和构造函数。

示例:

alert;
scrollTo;
document.getElementById;
location.reload;
setTimeout;