Вход/Регистрация
JavaScript. Подробное руководство, 6-е издание
вернуться

Флэнаган Дэвид

Шрифт:

writable: true,

enumerable:true,

configurable:true

},

y:{

value: 1,

writable: true,

enumerable:true,

configurable:true },

r:{

get: function { return Math.sqrt(this.x*this.x + this.y*this.y) },

enumerable:true,

configurable:true

}

});

В этом примере все начинается с пустого объекта, в который затем добавляются два свойства с данными и одно свойство с методами доступа, доступное только для чтения. Он опирается на тот факт, что

Object.defineProperties
возвращает модифицированный объект (подобно методу
Object.defineProperty
).

С методом

Object.сreate,
определяемым стандартом ECMAScript 5, мы познакомились в разделе 6.1, где узнали, что первым аргументом этому методу передается объект, который будет служить прототипом для вновь созданного объекта. Этот метод также принимает второй необязательный аргумент, такой же, как и второй аргумент метода
Object.defineProperties.
Если методу
Object.create
передать множество дескрипторов свойств, они будут использованы для создания свойств нового объекта.

Методы

Object.defineProperty
и
Object.defineProperties
возбуждают исключение
ТуреError
, когда создание или изменение свойств запрещено. Например, при попытке добавить новое свойство в нерасширяемый объект (раздел 6.8.3). Другие причины, по которым эти методы могут возбудить исключение
ТуреЕrror
, имеют непосредственное отношение к атрибутам. Атрибут
writable
контролирует попытки изменить атрибут
value
. А атрибут
configurable
контролирует попытки изменить другие атрибуты (а также определяет возможность удаления свойства). Однако все не так просто. Например, значение свойства, доступного только для чтения, можно изменить, если это свойство доступно для настройки. Кроме того, свойство, доступное только для чтения, можно сделать доступным для записи, даже если это свойство недоступно для настройки. Ниже приводится полный перечень правил. Вызовы
Object.defineProperty
или
Object.defineProperties,
нарушающие их, возбуждают исключение
ТуреЕrror
:

• Если объект нерасширяемый, можно изменить существующие собственные свойства этого объекта, но нельзя добавить в него новые свойства.

• Если свойство недоступно для настройки, нельзя изменить его атрибуты configurable и enumerable.

• Если свойство с методами доступа недоступно для настройки, нельзя изменить его методы чтения и записи и нельзя превратить его в простое свойство с данными.

• Если свойство с данными недоступно для настройки, нельзя превратить его в свойство с методами доступа.

• Если свойство с данными недоступно для настройки, нельзя изменить значение его атрибута

writable
с
false
на
true
, но его можно Изменить с
true
на
false
.

• Если свойство с данными недоступно для настройки и для записи, нельзя изменить его значение. Однако изменить значение свойства, недоступного для записи можно, если оно доступно для настройки (потому что свойство можно сделать доступным для записи, изменить его значение и затем опять сделать свойство доступным только для чтения).

Пример 6.2 включает функцию

extend,
которая копирует свойства из одного объекта в другой. Эта функция просто копирует имена и значения свойств и игнорирует их атрибуты. Кроме того, она не копирует методы чтения и записи из свойств с методами доступа, а просто преобразует их в свойства со статическими данными. В примере 6.3 показана новая версия
extend,
которая копирует все атрибуты свойств с помощью
Object.getOwnPropertyDescriptor
и
Object.defineProperty.
Но на этот раз данная версия оформлена не как функция, а как новый метод объекта и добавляется в
Object.prototype
как свойство, недоступное для перечисления.

Пример 6.3. Копирование атрибутов свойств

/*

* Добавляет неперечислимый метод extend в Object.prototype.

* Этот метод расширяет объекты возможностью копирования свойств из объекта,

* переданного в аргументе. Этот метод копирует не только значение свойств,

* но и все их атрибуты. Из объекта в аргументе копируются все собственные

  • Читать дальше
  • 1
  • ...
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: