Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 23.10.2009, 13:32
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Все-таки Opera -- мудацкий браузер
В каждой версии свои фичебаги, одна красочней другой.

В любом браузере, если нативную функцию привести к строке, мы получим что-то вроде "function addEventListener() { [native code] }", отличающуюся в разных браузерах только количеством пробельных символов. Так было до выхода Opera 10, в которой подобный финт выдает "function addEventListener() { /* source code not available */ }".

Что это значит? А это значит, что в Opera 10 мы не можем со стопроцентной уверенностью отличить нативную функцию от пользовательской (сделать тело функции [native code] пользователь не может, в отличие от комментариев). За что я и посылаю в очередной раз лучи ненависти разработчикам Оперы.

Кросспост если чо.
Ответить с цитированием
  #2 (permalink)  
Старый 23.10.2009, 14:18
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Зачем вообще на toString надеяться? В таких случаях разработчики туда все что угодно имеют право запихать, так же как они имеют право писать любые удобные для них комментарии к своему коду. Стандарты здесь никак не ограничивают и как вообще они могут ставить здесь какие-то ограничения. И js-разработчики не должны строить свой код на результате toString (по крайней мере, вызываемого у Function, Object и т. д.) . К сожалению многие уже настолько привыкли к тому, что он в таких случаях одно и то же возвращает, что уже браузер на основе этого определяют:
var isOpera = Object.prototype.toString.call(window.opera) == '[object Opera]';

Это на мой взгляд совсем не верно, в любой следующей версии '[object Opera]' может поменяться на все что угодно. И вообще молодцы что так делают, надо отучать от плохих привычек.
Ответить с цитированием
  #3 (permalink)  
Старый 23.10.2009, 14:26
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Riim,
я правильно понимаю, что ты хочешь предложить способ отличить нативную функцию от пользовательской? Валяй, я щас как раз над этим думаю.

Тем не менее все браузеры, в том числе Opera до 10-й версии, отдают [native code]. В этом и заключается мудачество Оперы, она не последовательна.

Я не удивлюсь, если в следующей версии все вернется обратно.

Последний раз редактировалось Kolyaj, 23.10.2009 в 14:30.
Ответить с цитированием
  #4 (permalink)  
Старый 23.10.2009, 14:39
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Сообщение от Kolyaj
я правильно понимаю, что ты хочешь предложить способ отличить нативную функцию от пользовательской?
нет не правильно, я другое пытался объяснить.

Сообщение от Kolyaj
отличить нативную функцию от пользовательской
а зачем это вообще? И что мешает для определения использовать вместе с "[native code]" еще один вариант: "/* source code not available */" ?
Ответить с цитированием
  #5 (permalink)  
Старый 23.10.2009, 14:39
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Сообщение от Riim
И js-разработчики не должны строить свой код на результате toString
Ты знаешь другой способ отличить хост-объект от пользовательского?
Ответить с цитированием
  #6 (permalink)  
Старый 23.10.2009, 14:42
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Сообщение от Kolyaj
Ты знаешь другой способ отличить хост-объект от пользовательского?
нет, не знаю, я пытался объяснить, что если в javascript-е это не предусмотрено, то это никак не проблемы разработчиков браузеров. Видно зря старался.
Ответить с цитированием
  #7 (permalink)  
Старый 23.10.2009, 14:44
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Сообщение от Riim
нет не правильно, я другое пытался объяснить.
Тогда это все демагогия. Если ты мне предложишь другой способ, я с удовольствием с тобой соглашусь, что toString -- это плохо.

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

Сообщение от Riim
И что мешает для определения использовать вместе с "[native code]" еще один вариант: "/* source code not available */" ?
Это крайний вариант, придется, разумеется, использовать его, если ничего не придумаю, но он с потенциальной дырой.
Ответить с цитированием
  #8 (permalink)  
Старый 23.10.2009, 14:54
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Сообщение от Kolyaj
Тогда это все демагогия
вот если бы ты с самого начала спросил о каком-то способе что-то сделать и я бы начал такое объяснять, то это было бы не в тему.
Ответить с цитированием
  #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.
Ответить с цитированием
  #10 (permalink)  
Старый 23.10.2009, 15:29
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Dmitry A. Soshnikov,
отличить-то как? Эти все прекрасы я и так знаю
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
глюк форума Gvozd Сайт Javascript.ru 11 18.03.2009 14:37
Помогите! Почему в Opera js-код работает с ошибкой. В IE все нормально. maxonline Events/DOM/Window 4 21.11.2008 12:39