ECMAscript 5: Обьекты и Свойства
ECMAScript 5 идёт по своему пути. Воскреснув из пепла ECMAScript 4, который был ужат обратно к ECMAScript 3.1, который далее был вновь назван ECMAScript 5 (подробнее) — он приходит с новым слоем функциональности, построенным на базе нашего любимого ECMAScript 3.
Анонсировано несколько новых API, включённых в спецификацию, но самая интересная функциональность заключена в коде обьектов и свойств. Этот новый код дает возможность существенно влиять на то, как пользователи смогут взаимодействовать с объектами, позволяя обеспечить геттеры и сеттеры, предотвратить перечисление, манипуляции, или удаление, и даже предотвратить добавление новых свойств. Короче говоря: Вы будете иметь возможность повторить и расширить существующий набор API для JavaScript (например, DOM), с помощью JavaScript (не используя более ничего).
Очень хорошая новость: Эти функции должны появиться во всех основных браузерах. Все основные поставщики браузеров работали над этой спецификацией, и договорились осуществлять ее в своих продуктах. Точные сроки пока не ясны, но велика вероятность скорой реализации.
Судя по всему, не существует полной реализации ES5 на сегодня, но несколько проектов уже в процессе реализации. В то же время вы можете прочитать спецификацию ECMAScript 5 (PDF — в этой статье я обсуждаю страницы 107-109), либо наблюдать за последними обсуждениями команды ECMAScript на Google.
ОбьектыНовая возможность ECMAScript 5 — расширяемость объектов теперь можно переключать. Отключение расширяемости может предотвратить добавление новых свойств к объекту.
ES5 предусматривает два способа манипулирования и проверки расширяемости объектов:
Object.preventExtensions( obj ), Object.isExtensible( obj )preventExtensions блокирует обьект и предотвращает создание любых новых свойств обьекта в будущем. isExtensible — возможность определить, расширяем в настоящее время обьект или нет.
print( Object.isExtensible( obj ) ); // true
obj.url = "http://ejohn.org/" ; // Exception in strict mode
print( Object.isExtensible( obj ) ); // false
* This source code was highlighted with Source Code Highlighter .
Свойства и дескрипторыСвойства были полностью пересмотрены. Они теперь не являются простыми значениями, связанными с объектом — теперь у вас есть полный контроль над тем, как они могут действовать. Большая сила связана, тем не менее, с повышенной сложностью.
Свойства обьектов разбиты на две части.
- Value. Хранит значение свойства.
- Get. Эта функция вызывается каждый раз, когда происходит доступ к значению свойства.
- Set. Эта функция вызывается каждый раз, когда значение свойства изменяется.
- Изменяемыми. Если ложь, то значение этого свойства не может быть изменено.
- Конфигурируемыми. Если ложь, любые попытки удалить свойство или изменить его атрибуты (записываемость, конфигурируемость или перечислимость) не получатся.
- Перечислимыми. Если истина, то свойство будет итерировано, когда пользователь делает for (var prop in obj) (или что-то в этом духе).
* This source code was highlighted with Source Code Highlighter .
Три атрибута (writable, enumerable и configurable) являются факультативными и все по умолчанию истинны. Таким образом, для свойства вам обязательно нужно предоставить только либо значение, либо геттер и сеттер.
Вы можете использовать новый метод Object.getOwnPropertyDescriptor для получения этой информации для уже существующего свойства обьекта.
Object.getOwnPropertyDescriptor( obj, prop )Этот метод позволяет получить доступ к дескриптору свойства. Он является единственным способом получить эту информацию (иначе говоря, дескрипторы не в распоряжении пользователя — они не существуют как видимые атрибуты свойства, они хранятся внутри в движке ECMAScript).
* This source code was highlighted with Source Code Highlighter .
Метод Object.defineProperty( obj, prop, desc )Этот метод позволяет определить новое свойство для объекта (или изменить дескриптор существующего свойства). Этот метод принимает дескриптор свойства и использует его для инициализации (или обновления) свойства.
var obj = ; Object.defineProperty( obj, "value" , );
( function ()