Показать сообщение отдельно
  #9 (permalink)  
Старый 23.10.2009, 15:20
Профессор
Отправить личное сообщение для Dmitry A. Soshnikov Посмотреть профиль Найти все сообщения от Dmitry A. Soshnikov
 
Регистрация: 25.02.2008
Сообщений: 707

Сообщение от Kolyaj
Ты знаешь другой способ отличить хост-объект от пользовательского?
Ну, Object.prototype.toString не предназначен именно для различий host-объектов от native-объектов. Он просто возвращает [[Class]], не более; host-объекты тоже имеют [[Class]].

Более того, реализации могут использовать любое значение [[Class]] для host-объектов (включая те, которые используются в native-объектах). В новой версии стандарта это будет исключено, но сейчас - это есть.

И некоторые, например JScript (IE), могут вообще белиберду туда впихнуть - для функции, например, может выдаваться "String", а не "Function":

// в IE - "String", в остальных - "Function"
alert(Object.prototype.toString.call(document.childNodes.item));


Или так:

// в IE - "Object", "object", в остальных - "Function", "function"
alert(Object.prototype.toString.call(window.alert));
alert(typeof window.alert); // "Object"


Сообщение от Kolyaj
Я пишу скрипты, работающие во вражеских окружениях, при этом они должны работать, в идеале, в 100% случаев, независимо от того, что намудрил очередной гуру
Примеры выше уже дают не 100%, независимо от "гуру".

По поводу проверки функций через .toString, IE, например, вообще может в этом представлении вставить элементы, не относящиеся к самой функции. Поэтому 100% не получится.

По стандарту, Opera, в принципе, правил не нарушает, т.к. Function.prototype.toString - "An implementation-dependent".

update:

Сообщение от Dmitry A. Soshnikov
Ну, Object.prototype.toString не предназначен именно для различий host-объектов от native-объектов. Он просто возвращает [[Class]], не более; host-объекты тоже имеют [[Class]].
А, имелся в виду Function.prototype.toString, а не Object.prototype.toString. Ну, всё равно, Function.prototype.toString, равно как и Object.prototype.toString (для host-объектов) - зависит от реализации.
__________________
Тонкости ECMAScript

Последний раз редактировалось Dmitry A. Soshnikov, 23.10.2009 в 15:26.
Ответить с цитированием