Все-таки Opera -- мудацкий браузер
В каждой версии свои фичебаги, одна красочней другой.
В любом браузере, если нативную функцию привести к строке, мы получим что-то вроде "function addEventListener() { [native code] }", отличающуюся в разных браузерах только количеством пробельных символов. Так было до выхода Opera 10, в которой подобный финт выдает "function addEventListener() { /* source code not available */ }". Что это значит? А это значит, что в Opera 10 мы не можем со стопроцентной уверенностью отличить нативную функцию от пользовательской (сделать тело функции [native code] пользователь не может, в отличие от комментариев). За что я и посылаю в очередной раз лучи ненависти разработчикам Оперы. Кросспост если чо. |
Зачем вообще на toString надеяться? В таких случаях разработчики туда все что угодно имеют право запихать, так же как они имеют право писать любые удобные для них комментарии к своему коду. Стандарты здесь никак не ограничивают и как вообще они могут ставить здесь какие-то ограничения. И js-разработчики не должны строить свой код на результате toString (по крайней мере, вызываемого у Function, Object и т. д.) . К сожалению многие уже настолько привыкли к тому, что он в таких случаях одно и то же возвращает, что уже браузер на основе этого определяют:
var isOpera = Object.prototype.toString.call(window.opera) == '[object Opera]'; Это на мой взгляд совсем не верно, в любой следующей версии '[object Opera]' может поменяться на все что угодно. И вообще молодцы что так делают, надо отучать от плохих привычек. |
Riim,
я правильно понимаю, что ты хочешь предложить способ отличить нативную функцию от пользовательской? Валяй, я щас как раз над этим думаю. Тем не менее все браузеры, в том числе Opera до 10-й версии, отдают [native code]. В этом и заключается мудачество Оперы, она не последовательна. Я не удивлюсь, если в следующей версии все вернется обратно. |
Цитата:
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
Цитата:
Цитата:
|
Цитата:
|
Цитата:
Более того, реализации могут использовать любое значение [[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" Цитата:
По поводу проверки функций через .toString, IE, например, вообще может в этом представлении вставить элементы, не относящиеся к самой функции. Поэтому 100% не получится. По стандарту, Opera, в принципе, правил не нарушает, т.к. Function.prototype.toString - "An implementation-dependent". update: Цитата:
|
Dmitry A. Soshnikov,
отличить-то как? :) Эти все прекрасы я и так знаю :) |
Цитата:
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
Цитата:
|
Не, в этом предложении я имел в виду 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). |
Цитата:
|
Первые версии Google Chrome вообще исходный код показывали :)
|
Так и щас показывают, но там другая ситуация.
|
Да нет, вот сейчас в 4-й версии пробую:
alert([].slice) выдает: Код:
function slice() { [native code] } |
Цитата:
Цитата:
|
Цитата:
|
Наверное, где-то здесь. Я вообще скачивал установщик по прямой ссылке с анонса 4-й версии на habrahabr.
________________________ А вот нашел http://www.google.com/chrome/eula.html?extra=devchannel |
Цитата:
Opera/9.80 (Windows NT 5.1; U; uk) Presto/2.2.15 Version/10.00 build 1750 |
x-yuri,
чудесно )) Это еще раз доказывает заголовок темы. Ибо я проверял, например, addEventListener. А то ИЕ6, ИЕ6. ИЕ6 -- это как таблица Менделеева: набор багов/фич известен, и можно предположить на основании этого, где могут обнаружится еще баги/фичи, а где они точно обнаружатся. Где обнаружатся баги/фичи в Опере предугадать невозможно. |
Kolyaj, ты просто не вкурил фишку, Опера позволяет отличить native-метод от host one ;)
Цитата:
|
Проблему автора не понял, но к названию темы +1
|
Часовой пояс GMT +3, время: 23:13. |