Написание 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.

Хорошо, это был хороший простой ответ, не так ли? Но вот несколько вопросов, которые вытекают из этого:

  1. "JavaScript" поддерживается в не-Mozilla браузерах, и в какой степени?
  2. "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 и т. Д.

  1. Должен ли я доверять IntelliSense VS2010?
  2. Где я могу найти ссылку на поддерживаемые ESv5 объекты и функции?
  3. Как определить, поддерживает ли браузер определенный объект или функцию?
  4. Есть ли что-нибудь лучше, чем VS2010, который поможет мне написать совместимый код ESv5?
  5. Безопасно ли переопределять реализации существующих объектов, таких как 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 использует другой способ и предоставляет для этого отдельный объект. Лично я предпочитаю оставлять нативные (и особенно хостовые) объекты в покое и иметь собственное пространство имен с нужными вам функциями.

Другие вопросы по тегам