JavaScript. Подробное руководство, 6-е издание, стр. 71
С методом
<b>Object.сreate(),</b><b>Object.defineProperties().</b><b>Object.create()</b>Методы
<b>Object.defineProperty()</b><b>Object.defineProperties()</b><b>ТуреError</b><b>ТуреЕrror</b><b>writable</b><b>value</b><b>configurable</b><b>Object.defineProperty()</b><b>Object.defineProperties(),</b><b>ТуреЕrror</b>• Если объект нерасширяемый, можно изменить существующие собственные свойства этого объекта, но нельзя добавить в него новые свойства.
• Если свойство недоступно для настройки, нельзя изменить его атрибуты configurable и enumerable.
• Если свойство с методами доступа недоступно для настройки, нельзя изменить его методы чтения и записи и нельзя превратить его в простое свойство с данными.
• Если свойство с данными недоступно для настройки, нельзя превратить его в свойство с методами доступа.
• Если свойство с данными недоступно для настройки, нельзя изменить значение его атрибута
<b>writable</b><b>false</b><b>true</b><b>true</b><b>false</b>• Если свойство с данными недоступно для настройки и для записи, нельзя изменить его значение. Однако изменить значение свойства, недоступного для записи можно, если оно доступно для настройки (потому что свойство можно сделать доступным для записи, изменить его значение и затем опять сделать свойство доступным только для чтения).
Пример 6.2 включает функцию
<b>extend(),</b><b>extend(),</b><b>Object.getOwnPropertyDescriptor()</b><b>Object.defineProperty().</b><b>Object.prototype</b>Пример 6.3. Копирование атрибутов свойств
<b>/*</b><b>* Добавляет неперечислимый метод extend() в Object.prototype.</b><b>* Этот метод расширяет объекты возможностью копирования свойств из объекта,</b><b>* переданного в аргументе. Этот метод копирует не только значение свойств,</b><b>* но и все их атрибуты. Из объекта в аргументе копируются все собственные</b><b>* свойства (даже недоступные для перечисления), за исключением одноименных</b><b>* свойств, имеющихся в текущем объекте.</b><b>*/</b><b>Object.defineProperty(Object.prototype,</b><b> "extend", // Определяется Object.prototype.extend</b><b> {</b><b> writable: true,</b><b> enumerable: false, // Сделать неперечислимым </b><b> configurable: true,</b><b> value: function(o) { // Значением свойства является данная функция</b><b> // Получить все собственные свойства, даже неперечислимые</b><b> var names = Object.getOwnPropertyNames(o);</b><b> // Обойти их в цикле</b><b> for(var і = 0: і < names.length; i++) {</b><b> // Пропустить свойства, уже имеющиеся в данном объекте </b><b> if (names[i] in this) continue;</b><b> // Получить дескриптор свойства из о</b><b> var desc = Object.getOwnPropertyDescriptor(o,names[i]);</b><b> // Создать с его помощью свойство в данном объекте</b><b> Object.defineProperty(this, names[i], desc);</b><b> }</b><b> }</b><b>});</b>6.7.1. Устаревшие приемы работы с методами чтения и записи
Синтаксис определения свойств с методами доступа в литералах объектов, описанный разделе 6.6, позволяет определять свойства с методами в новых объектах, но, он не дает возможности получать методы чтения и записи и добавлять новые свойства с методами доступа к существующим объектам. В ECMAScript 5 для этих целей можно использовать
<b>Object.getOwnPropertyDescriptor()</b><b>Object.defineProperty()</b>