Россия, Звенигород |
Скрипты
5.4. Расширения языка
Реализация языка JavaScript в Mozilla обладает несколькими особенностями, дополняющими стандарт ECMA-262.
5.4.1. Расширения Mozilla SpiderMonkey
Интерпретатор Mozilla SpiderMonkey толерантно относится к тому, что составляет корректную инструкцию:
x++ % y++;
Это поведение соответствует стандарту, но другие реализации JavaScript не поддерживают его.
Возможно, самым полезным расширением стандарта является особенность, позволяющая методам JavaScript get и set быть связанными со свойством объекта. Другими словами, побочным эффектом при чтении или задании значения свойства будет вызов целой функции. Данная функция должна реализовывать и стандартное действие, которое происходит при чтении или записи свойства. В листинге 5.6 демонстрируется работа этих расширений.
var obj = { get foo () { effect1(); return this._real_foo; }, set foo (val) { effect2(); return this._real_foo = val;}, _real_foo: "bar" } var x = obj.foo; // вызывается effect1() и x = "bar" obj.foo = "zip"; // вызывается effect2() runs и _real_foo = "zip"Листинг 5.6. Создание активного свойства в объекте JavaScript
В этом примере свойство _real_foo хранит действительное значение свойства foo, которое существует только как интерфейс. В терминах стандарта ECMAScript эти особые функции позволяют реализовывать для свойств операции [[Get]] и [[Put]], и это будут такие функции, которые вам нужны.
Mozilla также предоставляет некоторые функции для управления перечисленными выше методами. Это
_defineGetter__("имя-свойства", объект-функция); _defineSetter__("имя-свойства", объект-функция); _lookupGetter__("имя-свойства"); _lookupSetter__("имя-свойства");
Первые две функции делают то же, что и функции get и set из предыдущего примера. Следующие две функции возвращают имя функции, использующейся для чтения или изменения значения указанного свойства.
Mozilla также поддерживает свойство __parent__, которое влияет на внутреннее свойство [[Scope]] объектов-функций. В JavaScript в Mozilla это свойство также доступно и всем собственным объектам и объектам базового ПО.
Наконец, Mozilla предоставляет свойство __proto__, с помощью которого можно явно задавать или читать внутреннее свойство [[Prototype]], описанное в стандарте.
5.4.2. Расширения из ECMA-262, четвертая редакция
Четвертая редакция ECMA-262, существующая пока еще только в виде черновика, будет результатом пересмотра языка, преследующего множество целей. В сущности, это попытка расширить язык так, чтобы он был полностью объектно-ориентированным, поддерживал модули, лучшие интерфейсы с другими языками и включал еще много мелких улучшений. Будет произведена замена системы прототипов системой классов и введен режим строгого соответствия, требующий совместимости с четвертой редакцией стандарта. Для совместимости с предыдущими версиями будет использоваться режим нестрогого соответствия.
Некоторые из предложенных в этом черновике улучшений присутствуют в SpiderMonkey 1.5, но поддержка нового стандарта скоро будет закончена. Начать изучение особенностей четвертой редакции можно на сайте http://www.mozilla.org/js/language/.
Простое расширение из четвертой редакции - поддержка констант:
const varname = 5;
В Mozilla есть настройка javascript.options.strict, которой можно задать значение true. Ее также можно найти в настройках, связанных с отладкой, если используется тестовая версия платформы. Это не то же самое, что режим строго соответствия из черновика стандарта; это просто дополнительная проверка корректности кода в соответствии с третьей редакцией стандарта. Разработчикам рекомендуется ею пользоваться.
Планируется, что SpiderMonkey 2.0 будет соответствовать четвертой редакции стандарта.
5.4.3. Расширения из соображений защиты
Платформа Mozilla запускает интерпретируемые скрипты на компьютере пользователя, что в принципе может быть небезопасно. Платформа предоставляет разные функции обеспечения защиты, и некоторые из них относятся к JavaScript. Более подробно о защите рассказано в "Объекты XPCOM" , "Объекты XPCOM".
Скрипт выдаст ошибку, если во время работы будет превышено довольно большое число допустимых возвращающих инструкций - 4194304. В сущности, возвращающая инструкция - любая часть выполняемого скрипта, которая является возвратом функции, новой итерацией цикла или прерыванием области действия из-за исключения. Такая ситуация рассматривается как атака с целью вызвать отказ в обслуживании, при которой ввод пользователем данных никак не обрабатывается. В браузере такая ошибка приводит к появлению окна с предупреждением, где пользователь может прервать работу скрипта.
Тем не менее, скрипт все равно может выполнять долгую, ресурсоемкую обработку - достаточно просто разделить работу на несколько частей и выполнять каждую из них, используя методы setTimeout() и setInterval(). Таким образом, между выполнением частей скрипта будут небольшие паузы, в которые введенные пользователем данные могут обрабатываться, а значит, предупреждающее окно не появится.
Основная стратегия защиты в Mozilla - принцип "с того же сайта". Скрипт, загруженный с одного сайта (домен и путь) не может взаимодействовать с документом или ресурсом другого сайта (менее точный путь). Таким образом, окна Mozilla остаются не зависящими друг от друга. При попытке записи в переменную в окне, куда доступ запрещен из соображений защиты, приводит к генерации исключения (ошибки).
От ограничений из соображений защиты освобождаются скрипты, хранящиеся в chrome. Самое большое ограничение - свойство Components объекта Window или ChromeWindow полностью доступно. Это свойство - дорожка к XPCOM-компонентам Mozilla. Ни один из этих компонентов не доступен извне chrome. Некоторые из этих объектов лежат в основе какой-либо функциональности, доступ к которой осуществляется другим способом. Пример: объект, реализующий объект Form, доступный в HTML- документах.
скрипты JavaScript могут быть подписаны с помощью технологии цифровых сертификатов. В этом случае скрипту могут предоставляться возможности, равные возможностям скриптов из chrome.