Написание кода, совместимого с ECMAScript5.

Я хочу создать библиотеку на JavaScript/JScript/ECMAScript... как бы вы ее ни называли, которая будет ориентироваться на современные стандарты (HTML5, CSS3, ESv5) с учетом этого, любой браузер, поддерживающий стандарт! Теперь я знаю, что уже существует множество полезных библиотек, например, jQuery и MooTools. Конечно, они великолепны, и я уже использую их там, где это необходимо, но меня не следует заставлять прыгать на той же подножке, что и любого другого разработчика, только потому, что это популярно!

Итак, ради следующих вопросов давайте не будем интересоваться сторонними библиотеками, такими как jQuery и MooTools. Давайте перейдем к мельчайшим деталям JavaScript/JScript/ECMAScript.

Во-первых, я задал вопрос до этого (В чем разница между JavaScript, JScript и ECMAScript?), так как я не знал, в чем разница.

К счастью, я сделал следующие выводы:

ECMAScript — это спецификация языка. JavaScript и JScript являются диалектами ECMAScript.

JavaScript — это реализация Mozilla ECMAScript.

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/#showold

Опять же, используя те же браузеры (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... или это просто отговорка?


person Matthew Layton    schedule 21.08.2012    source источник
comment
Это вопрос или история? Пожалуйста, постарайтесь не усложнять и пояснить, на какой (уникальный) технический вопрос вы просите нас ответить.   -  person Denys Séguret    schedule 21.08.2012
comment
@dystroy Мне очень нравится, на что зашел автор, чтобы получить точные ответы, которые он ищет ... людей не следует заставлять писать двухстрочные вопросы, особенно для такого поучительного вопроса, как этот.   -  person Zathrus Writer    schedule 21.08.2012
comment
Там много вопросов. Я просто хотел, чтобы люди знали о моем исследовании, поскольку они могут предложить что-то, что я уже сделал. Я предполагаю, что это довольно сложно, поскольку я предполагаю, что некоторые из этих вопросов открыты для мнений, а не для фактов.   -  person Matthew Layton    schedule 21.08.2012
comment
Я принимаю ваши очки. И явно были хорошие усилия в этом вопросе. Но, пожалуйста, просмотрите часто задаваемые вопросы по открытым вопросам и спросите себя, можно ли дать четкий ответ.   -  person Denys Séguret    schedule 21.08.2012


Ответы (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. Исправление состояло в том, чтобы просто обернуть определение Prototype в if (document.getElementsByClassName == undefined) { }

person Robin Whittleton    schedule 21.08.2012
comment
Спасибо за этот ответ, он очень информативный и, безусловно, поможет мне написать мою библиотеку. - person Matthew Layton; 21.08.2012
comment
Вы смотрели Модернизр? Конечно, они сосредоточены на проблемах с отображением, но по своей сути они проводят множество тестов функций. Может дать вам некоторые идеи. modernizr.com и github.com/Modernizr/Modernizr/tree/master/feature-detects - person Robin Whittleton; 21.08.2012

2) Я считаю обзор, который вы предоставили, довольно хорошим. Что еще вы хотите?

3) Хорошей библиотекой для выравнивания различий между браузерами является ES5-shim. Он автоматически определяет функции и предоставляет прокладки для браузеров, которые не поддерживаются.

4) Всегда используйте "use strict"; и хороший редактор по вашему выбору, который имеет какую-то подсветку кода и, возможно, завершение кода. Я использую консоли браузера или блокнот Firefox (дурацкое название для хорошего инструмента) для быстрых хакерских сеансов и объединяю все это в notepad++ (= IDE по вашему выбору).

5) Расширение собственных объектов javascript много обсуждалось и имеет свои плюсы и минусы. Prototype и MooTools идут по этому пути. jQuery идет другим путем и предоставляет для этого отдельный объект. Лично я предпочитаю оставить нативные (и особенно хостовые) объекты в покое и иметь собственное пространство имен с нужными вам функциями.

person Christoph    schedule 21.08.2012
comment
Спасибо за этот ответ. Я нашел там некоторые моменты, особенно пункт 5, очень интересный. Обязательно учту это при разработке моей библиотеки. - person Matthew Layton; 21.08.2012