--- title: Object.defineProperties() slug: Web/JavaScript/Reference/Global_Objects/Object/defineProperties tags: - ECMAScript 5 - JavaScript - Object - метод translation_of: Web/JavaScript/Reference/Global_Objects/Object/defineProperties ---
Метод Object.defineProperties()
визначає нові або модифікує існуючі властивості прямо на об'єкті, вертаючи цей об'єкт.
Object.defineProperties(obj, props)
obj
props
props
має бути або дескриптором даних, або дескриптором доступу; воно не може бути обома (детальніше читайте у {{jsxref("Object.defineProperty()")}}).configurable
true
тоді й тільки тоді, коли тип цього дескриптора властивості може бути змінений, і якщо властивість може бути видалена з відповідного об'єкта.false
.enumerable
true
тоді й тільки тоді, коли ця властивість відображається під час переліку властивостей відповідного об'єкта.false
.Дескриптор даних також має наступні необов'язкові ключі:
value
writable
true
тоді й тільки тоді, коли значення, пов'язане з властивістю, може бути змінене {{jsxref("Operators/Оператори_присвоєння", "оператором присвоєння", "", 1)}}.false
.Дескриптор доступу також має наступні необов'язкові ключі:
get
set
Якщо в дескриптора немає жодного з ключів value
, writable
, get
або set
, він сприймається як дескриптор даних. Якщо дескриптор має і value
або writable
, і get
або set
, викидається виняток.
Об'єкт, переданий у функцію.
Метод Object.defineProperties
, по суті, визначає всі властивості у відповідності до власних перелічуваних властивостей props
на об'єкті obj
.
var obj = {}; Object.defineProperties(obj, { 'property1': { value: true, writable: true }, 'property2': { value: 'Привіт', writable: false } // і т.д., і т.п. });
За умови незміненого середовища виконання, де всі імена та властивості посилаються на свої первинні значення, метод Object.defineProperties
є майже повністю еквівалентним (зауважте коментар у isCallable
) наступній реімплементації у JavaScript:
function defineProperties(obj, properties) { function convertToDescriptor(desc) { function hasProperty(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } function isCallable(v) { // Увага: відредагуйте за необхідності, якщо інші значення, крім функцій, доступні для виклику. return typeof v === 'function'; } if (typeof desc !== 'object' || desc === null) throw new TypeError('bad desc'); var d = {}; if (hasProperty(desc, 'enumerable')) d.enumerable = !!desc.enumerable; if (hasProperty(desc, 'configurable')) d.configurable = !!desc.configurable; if (hasProperty(desc, 'value')) d.value = desc.value; if (hasProperty(desc, 'writable')) d.writable = !!desc.writable; if (hasProperty(desc, 'get')) { var g = desc.get; if (!isCallable(g) && typeof g !== 'undefined') throw new TypeError('bad get'); d.get = g; } if (hasProperty(desc, 'set')) { var s = desc.set; if (!isCallable(s) && typeof s !== 'undefined') throw new TypeError('bad set'); d.set = s; } if (('get' in d || 'set' in d) && ('value' in d || 'writable' in d)) throw new TypeError('identity-confused descriptor'); return d; } if (typeof obj !== 'object' || obj === null) throw new TypeError('bad obj'); properties = Object(properties); var keys = Object.keys(properties); var descs = []; for (var i = 0; i < keys.length; i++) descs.push([keys[i], convertToDescriptor(properties[keys[i]])]); for (var i = 0; i < descs.length; i++) Object.defineProperty(obj, descs[i][0], descs[i][1]); return obj; }
Специфікація | Статус | Коментар |
---|---|---|
{{SpecName('ESDraft', '#sec-object.defineproperties', 'Object.defineProperties')}} | {{Spec2('ESDraft')}} | |
{{SpecName('ES6', '#sec-object.defineproperties', 'Object.defineProperties')}} | {{Spec2('ES6')}} | |
{{SpecName('ES5.1', '#sec-15.2.3.7', 'Object.defineProperties')}} | {{Spec2('ES5.1')}} | Початкове визначення. Реалізоване у JavaScript 1.8.5 |
{{Compat("javascript.builtins.Object.defineProperties")}}