Опубликован: 10.12.2007 | Уровень: специалист | Доступ: платный
Лекция 5:

Скрипты

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.

Дмитрий Гуменюк
Дмитрий Гуменюк
Россия, Звенигород
Konstantin Grishko
Konstantin Grishko
Россия, Москва, Московский финансово-промышленный университет "Синергия", Москва