ECMAscript 5: Обьекты и Свойства

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 ()

📎📎📎📎📎📎📎📎📎📎