Почему некоторые встроенные функции в IE8 не являются экземплярами Function?

Я заметил, что alert и console.log не работают, как обычные объекты JavaScript в IE8. У кого-нибудь есть объяснение для этого?

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

Найдено здесь: http://perfectionkills.com/whats-wrong-with-extending-the-dom/

ECMA-262 3rd. изд:

Хост-объекты могут реализовывать эти внутренние методы с помощью любых поведение, зависящее от реализации, или может быть, что объект-хост реализует только некоторые внутренние методы, а не другие.

В описании внутренних методов упоминаются [[Get]], [[Put]], [[Delete]] и т.д. Обратите внимание, как говорится, что поведение внутренних методов зависит от реализации. Это означает, что для объекта-хозяина абсолютно нормально запускать ошибку при вызове, скажем, метода [[Get]].


Итак, IE не нарушает спецификацию. Поведение совместимо, и все встроенные функции, которые не являются частью языка JavaScript, работают так. Вы не можете назначать им свойства, у них нет прототипов и конструкторов.

Примеры:

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