JavaScript. Подробное руководство, 6-е издание, стр. 70
Методы получения и записи значений атрибутов свойств, предусмотренные стандартом ECMAScript 5, используют объект, называемый дескриптором свойства (
<b>property descriptor</b><b>value</b><b>writable</b><b>enumerable</b><b>configurable</b><b>value</b><b>writable</b><b>get</b><b>set</b><b>writable</b><b>enumerable</b><b>configurable</b><b>get</b><b>set</b>Получить дескриптор свойства требуемого объекта можно вызовом
<b>Object.get-OwnPropertyDescriptor():</b><b>// Вернет {value: 1, writable:true, enumerable:true, configurable:true}</b><b>Object.getOwnPropertyDescriptor({x:1}, "x");</b><b>// Теперь получим свойство octet объекта random, объявленного выше.</b><b>// Вернет { get: /*func*/. set:undefined, enumerable:true, configurable:true}</b><b>Object.getOwnPropertyDescriptor(random, "octet");</b><b>// Вернет undefined для унаследованных и несуществующих свойств. </b><b>Object.getOwnPropertyDescriptor({}, "х"); // undefined, нет такого свойства</b><b>Object.getOwnPropertyDescriptor({}, "toString"); // undefined, унаследованное</b>Как можно заключить из названия метода,
<b>Object.getOwnPropertyDescriptor()</b><b>Object.getPrototypeOf()</b>Чтобы изменить значение атрибута свойства или создать новое свойство с заданными значениями атрибутов, следует вызвать метод
<b>Object.defineProperty()</b><b>var о = {}; // Создать пустой объект без свойств</b><b>// Создать неперечислимое простое свойство х со значением 1.</b><b>Object.defineProperty(o, "х", { value : 1,</b><b> writable: true, enumerable: false, configurable: true}):</b><b>// Убедиться, что свойство создано и является неперечислимым </b><b>о.х; // => 1</b><b>Object.keys(o) // => []</b><b>// Теперь сделать свойство х доступным только для чтения </b><b>Object.defineProperty(o, "х", { writable: false });</b><b>// Попытаться изменить значение свойства</b><b>о.х = 2; // Неудача, в строгом режиме возбудит ТуреЕrror</b>Дескриптор свойства, передаваемый методу
<b>Object.defineProperty(),</b><b>false</b><b>undefined</b>Если возникнет необходимость создать или изменить сразу несколько свойств, можно воспользоваться методом
<b>Object.defineProperties().</b><b>var р = Object.defineProperties({},{</b><b> х:{ </b><b> value: 1, </b><b> writable: true,</b><b> enumerable:true, </b><b> configurable:true </b><b> }, </b><b> y:{ </b><b> value: 1,</b><b> writable: true,</b><b> enumerable:true,</b><b> configurable:true },</b><b> r:{</b><b> get: function() { return Math.sqrt(this.x*this.x + this.y*this.y) },</b><b> enumerable:true,</b><b> configurable:true</b><b> }</b><b>});</b>В этом примере все начинается с пустого объекта, в который затем добавляются два свойства с данными и одно свойство с методами доступа, доступное только для чтения. Он опирается на тот факт, что
<b>Object.defineProperties()</b><b>Object.defineProperty()</b>