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,
отличить-то как? :) Эти все прекрасы я и так знаю :)

Dmitry A. Soshnikov 23.10.2009 15:33

Цитата:

Сообщение от Kolyaj
Эти все прекрасы я и так знаю

Ну хорошо тогда. Это я неправильно прочитал в твоём тексте о "100%" ;)

Цитата:

Сообщение от Kolyaj
отличить-то как?

100% - никак, т.к. (повторюсь) - Function.prototype.toString - "An implementation-dependent".

Kolyaj 23.10.2009 15:38

Цитата:

Сообщение от Dmitry A. Soshnikov
Это я неправильно прочитал в твоём тексте о "100%"

Там про идеал еще, недостижимый к сожалению, написано :)

Dmitry A. Soshnikov 23.10.2009 20:37

Цитата:

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

Кстати, то, что ты хотел отличить, это "build-in/host от native не build-in", а не "host от пользовательского".

Kolyaj 23.10.2009 20:40

Цитата:

Сообщение от Dmitry A. Soshnikov
Кстати, то, что ты хотел отличить, это "build-in/host от native не build-in", а не "host от пользовательского".

Где?

Dmitry A. Soshnikov 23.10.2009 20:56

Цитата:

Сообщение от Kolyaj
Где?

Ты написал:

Цитата:

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

Я поправил, что, коль скоро ты полагаешься на строку "[native code]", это не означает именно эту проверку, т.к. это не обязательно host-объект.

Kolyaj 23.10.2009 21:31

Не, в этом предложении я имел в виду Array, Date и иже с ними.

Dmitry A. Soshnikov 23.10.2009 21:43

Цитата:

Сообщение от Kolyaj
Не, в этом предложении я имел в виду Array, Date и иже с ними.

Тогда у тебя есть путаница, которую надо искоренить:

Array, Date - это не host-объекты, это build-in объекты.

host-объекты - это все объекты, которые добавляет реализация, т.е. те, которые стандарт не описывает. Например: alert, window и т.д.

А native-объекты - это те, которые стандарт описывает. Например, new Object, new Array, new Date, Object, Array, Date.

А build-in-объекты - это подмножество native-объектов, которые встроены до начала программы. Например, Array, Date, но не new Array, new Date (имеются в виду те, которые будут объявлены уже в процессе программы и будут являются native- не build-in).

Kolyaj 23.10.2009 21:52

Цитата:

Сообщение от Dmitry A. Soshnikov
Тогда у тебя есть путаница, которую надо искоренить:

Спасибо за искоренение :)

Octane 23.10.2009 22:19

Первые версии Google Chrome вообще исходный код показывали :)

Kolyaj 23.10.2009 22:22

Так и щас показывают, но там другая ситуация.

Octane 23.10.2009 22:25

Да нет, вот сейчас в 4-й версии пробую:
alert([].slice)

выдает:
Код:

function slice() { [native code] }
А раньше исходники показывал.

Kolyaj 23.10.2009 22:30

Цитата:

Сообщение от Octane
Да нет, вот сейчас в 4-й версии пробую:

Действительно, я в 3-й пробую.

Цитата:

Сообщение от Octane
function slice() { [native code] }

ЧТД :)

Riim 23.10.2009 23:31

Цитата:

Сообщение от Octane
сейчас в 4-й версии пробую

а где 4-ю взять? Я установщик скачиваю, он мне только 3-ю устанавливает.

Octane 24.10.2009 01:10

Наверное, где-то здесь. Я вообще скачивал установщик по прямой ссылке с анонса 4-й версии на habrahabr.
________________________
А вот нашел http://www.google.com/chrome/eula.html?extra=devchannel

x-yuri 26.10.2009 01:19

Цитата:

Сообщение от Kolyaj
В любом браузере, если нативную функцию привести к строке, мы получим что-то вроде "function addEventListener() { [native code] }", отличающуюся в разных браузерах только количеством пробельных символов.

а покажи, как приводишь. Потому что у меня Array.prototype.push.toString() выводит function () { [native code] }
Opera/9.80 (Windows NT 5.1; U; uk) Presto/2.2.15 Version/10.00
build 1750

Kolyaj 26.10.2009 12:09

x-yuri,
чудесно )) Это еще раз доказывает заголовок темы. Ибо я проверял, например, addEventListener.

А то ИЕ6, ИЕ6. ИЕ6 -- это как таблица Менделеева: набор багов/фич известен, и можно предположить на основании этого, где могут обнаружится еще баги/фичи, а где они точно обнаружатся. Где обнаружатся баги/фичи в Опере предугадать невозможно.

x-yuri 26.10.2009 15:00

Kolyaj, ты просто не вкурил фишку, Опера позволяет отличить native-метод от host one ;)

Цитата:

Сообщение от Kolyaj
А то ИЕ6, ИЕ6. ИЕ6 -- это как таблица Менделеева

всегда найдет чем тебя удивить

IIIEPJIOK 29.10.2009 23:43

Проблему автора не понял, но к названию темы +1


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