Почему некоторые встроенные функции в IE8 не являются экземплярами Function? - PullRequest
2 голосов
/ 12 ноября 2011

Я заметил, что 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 Ответ

2 голосов
/ 12 ноября 2011

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

ECMA-262 3-й. изд:

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

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


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

Примеры:

alert;
scrollTo;
document.getElementById;
location.reload;
setTimeout;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...