Сообщение от 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-объектов) - зависит от реализации.