Написание ECMAScript5-совместимого кода
Я хочу создать библиотеку на JavaScript/JScript/ECMAScript... как бы вы ее ни называли, которая будет ориентирована на современные стандарты (HTML5, CSS3, ESv5) с учетом этого на любой браузер, поддерживающий этот стандарт! Теперь я знаю, что уже есть много полезных библиотек, например, jQuery и MooTools. Конечно, они великолепны, и я уже использую их там, где это необходимо, но я не должен быть вынужден прыгать на той же платформе, что и любой другой разработчик, только потому, что она популярна!
Итак, ради следующих вопросов, давайте не будем заниматься сторонними библиотеками, такими как jQuery и MooTools. Давайте перейдем к мельчайшим JavaScript / JScript / ECMAScript.
Во-первых, я задал вопрос до этого ( Какая разница между JavaScript, JScript и ECMAScript?), Так как я не знал, в чем разница.
К счастью, я сделал следующий вывод:
ECMAScript - это языковая спецификация. JavaScript и JScript являются диалектами ECMAScript.
JavaScript - это реализация ECMAScript в Mozilla.
JScript - это реализация Microsoft ECMAScript.
Хорошо, это был хороший простой ответ, не так ли? Но вот несколько вопросов, которые вытекают из этого:
- "JavaScript" поддерживается в не-Mozilla браузерах, и в какой степени?
- "JScript" поддерживается в не-Microsoft браузерах, и в какой степени?
Основываясь на этих двух вопросах, я немного покопался и провел простой тест на IE9, FF14 и GC19.
Вот тестовый код:
<!DOCTYPE html>
<html>
<head>
<title>HTML 5 Template</title>
<script language="JavaScript1.3">
jsver = "1.3";
</script>
<script language="JavaScript1.4">
jsver = "1.4";
</script>
<script language="JavaScript1.5">
jsver = "1.5";
</script>
<script language="JavaScript1.6">
jsver = "1.6";
</script>
<script language="JavaScript1.7">
jsver = "1.7";
</script>
<script language="JavaScript1.8">
jsver = "1.8";
</script>
<script type="text/javascript">
document.write("<B>Your browser supports JavaScript version " + jsver + ".</B>")
</script>
</head>
<body>
</body>
</html>
Результаты были следующими: IE9 = JSv1.3, FF14 = JSv1.8, GC19 = JSv1.7
Хорошо, тогда я запустил этот тест, который проверяет поддержку ECMAScript версии 5: http://kangax.github.com/es5-compat-table/
Опять же, используя те же браузеры (IE9, FF14, GC19), ESv5, похоже, довольно хорошо поддерживается!
Теперь наступает хитрый момент! Я родом из Microsoft и пишу программное обеспечение на таких языках, как C#, ASP.NET и т. Д., Поэтому, естественно, мой IDE - Visual Studio (в настоящее время 2010). Когда я просматриваю IntelliSense JavaScript, я вижу такие вещи, как ActiveXObject, Array, Object и т. Д.
- Должен ли я доверять IntelliSense VS2010?
- Где я могу найти ссылку на поддерживаемые ESv5 объекты и функции?
- Как определить, поддерживает ли браузер определенный объект или функцию?
- Есть ли что-нибудь лучше, чем VS2010, который поможет мне написать совместимый код ESv5?
- Безопасно ли переопределять реализации существующих объектов, таких как Object, Number, Boolean и т. Д., Или я должен просто расширить существующую реализацию?
Наконец, о себе с jQuery. Допустим, я не могу сами написать основную совместимость и функциональность, могу ли я просто написать свою библиотеку, чтобы она была на вершине jQuery... или это просто отговорка?
2 ответа
1) Нет. Конечно, это не будет ограничиваться только действительным ECMAScript.
2) http://kangax.github.com/es5-compat-table/ всегда полезен.
3) Вы можете просто проверить, определено ли оно. Например
typeof(Array.isArray) === 'function'; // true in newer browsers, false in IE8
4) Лучше всего прочитать спецификацию! С помощью "use strict";
в вашем коде также будут отлавливаться некоторые классы ошибок и это хорошая практика. Дополнительную информацию о строгом режиме можно найти по адресу http://ejohn.org/blog/ecmascript-5-strict-mode-json-and-more/
5) Конечно, я бы не стал заменять оригинальные предметы. Если вы собираетесь расширять свойства, я бы сначала дважды проверил, что совместимая реализация еще не существует. Например, PrototypeJS добавил (до того, как браузеры его реализовали) document.getElementsByClassName
, Когда браузеры начали реализовывать его изначально, они обнаружили, что сайты, использующие Prototype, все еще используют медленную версию на основе JS. Исправление состояло в том, чтобы обернуть определение прототипа в if (document.getElementsByClassName == undefined) { }
2) Я считаю, что предоставленный вами обзор довольно хорош. Что еще вы хотите?
3) Хорошая библиотека для выравнивания различий между браузерами - ES5-shim. Он автоматически определяет функции и обеспечивает поддержку браузеров, которым не хватает поддержки.
4) Всегда используйте "use strict";
и иметь хороший редактор на ваш выбор, который имеет некоторую подсветку кода и, возможно, завершение кода. Я использую консоли браузера или блокнот Firefox (глупое название для хорошего инструмента) для быстрых сеансов взлома и собираю все это в notepad++ (= IDE по вашему выбору).
5) Расширение нативных объектов javascript было спорным и имеет свои плюсы и минусы. Прототип и MooTools идут по этому пути. jQuery использует другой способ и предоставляет для этого отдельный объект. Лично я предпочитаю оставлять нативные (и особенно хостовые) объекты в покое и иметь собственное пространство имен с нужными вам функциями.