Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Все-таки Opera -- мудацкий браузер (https://javascript.ru/forum/misc/5564-vse-taki-opera-mudackijj-brauzer.html)

Kolyaj 23.10.2009 13:32

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

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

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

Кросспост если чо.

Riim 23.10.2009 14:18

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

Это на мой взгляд совсем не верно, в любой следующей версии '[object Opera]' может поменяться на все что угодно. И вообще молодцы что так делают, надо отучать от плохих привычек.

Kolyaj 23.10.2009 14:26

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

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

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

Riim 23.10.2009 14:39

Цитата:

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

нет не правильно, я другое пытался объяснить.

Цитата:

Сообщение от Kolyaj
отличить нативную функцию от пользовательской

а зачем это вообще? И что мешает для определения использовать вместе с "[native code]" еще один вариант: "/* source code not available */" ?

Kolyaj 23.10.2009 14:39

Цитата:

Сообщение от Riim
И js-разработчики не должны строить свой код на результате toString

Ты знаешь другой способ отличить хост-объект от пользовательского?

Riim 23.10.2009 14:42

Цитата:

Сообщение от Kolyaj
Ты знаешь другой способ отличить хост-объект от пользовательского?

нет, не знаю, я пытался объяснить, что если в javascript-е это не предусмотрено, то это никак не проблемы разработчиков браузеров. Видно зря старался.

Kolyaj 23.10.2009 14:44

Цитата:

Сообщение от Riim
нет не правильно, я другое пытался объяснить.

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

Цитата:

Сообщение от Riim
а зачем это вообще?

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

Цитата:

Сообщение от Riim
И что мешает для определения использовать вместе с "[native code]" еще один вариант: "/* source code not available */" ?

Это крайний вариант, придется, разумеется, использовать его, если ничего не придумаю, но он с потенциальной дырой.

Riim 23.10.2009 14:54

Цитата:

Сообщение от Kolyaj
Тогда это все демагогия

вот если бы ты с самого начала спросил о каком-то способе что-то сделать и я бы начал такое объяснять, то это было бы не в тему.

Dmitry A. Soshnikov 23.10.2009 15:20

Цитата:

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

Kolyaj 23.10.2009 15:29

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


Часовой пояс GMT +3, время: 18:20.