Метод Object.defineProperties()
визначає нові або модифікує існуючі властивості прямо на об'єкті, вертаючи цей об'єкт.
The source for this interactive example is stored in a GitHub repository. If you'd like to contribute to the interactive examples project, please clone https://github.com/mdn/interactive-examples and send us a pull request.
Синтаксис
Object.defineProperties(obj, props)
Параметри
obj
- Об'єкт, на якому визначаються чи модифікуються властивості.
props
- Об'єкт, чиї ключі відображають імена властивостей, які треба визначити чи модифікувати, і чиї значення є об'єктами, що описують ці властивості. Кожне значення у
props
має бути або дескриптором даних, або дескриптором доступу; воно не може бути обома (детальніше читайте уObject.defineProperty()
). - Дескриптори даних та дескриптори доступу можуть мати наступні необов'язкові ключі:
-
configurable
- Дорівнює
true
тоді й тільки тоді, коли тип цього дескриптора властивості може бути змінений, і якщо властивість може бути видалена з відповідного об'єкта.
За замовчуваннямfalse
. enumerable
- Дорівнює
true
тоді й тільки тоді, коли ця властивість відображається під час переліку властивостей відповідного об'єкта.
За замовчуваннямfalse
.
Дескриптор даних також має наступні необов'язкові ключі:
value
- Значення, пов'язане з властивістю. Може бути будь-яким з чинних значень JavaScript (числом, об'єктом, функцією і т.д.).
За замовчуваннямundefined
. writable
- Дорівнює
true
тоді й тільки тоді, коли значення, пов'язане з властивістю, може бути змінене оператором присвоєння.
За замовчуваннямfalse
.
Дескриптор доступу також має наступні необов'язкові ключі:
get
- Функція, що виступає властивістю-гетером, або
undefined
, якщо гетера немає. Значення, що повертає функція, буде використане як значення властивості.
За замовчуваннямundefined
. set
- Функція, що виступає властивістю-сетером, або
undefined
, якщо сетера немає. Функція буде отримувати єдиним аргументом нове значення, що призначається властивості.
За замовчуваннямundefined
.
Якщо в дескриптора немає жодного з ключів
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;
}
Специфікації
Специфікація | Статус | Коментар |
---|---|---|
ECMAScript (ECMA-262) The definition of 'Object.defineProperties' in that specification. |
Living Standard | |
ECMAScript 2015 (6th Edition, ECMA-262) The definition of 'Object.defineProperties' in that specification. |
Standard | |
ECMAScript 5.1 (ECMA-262) The definition of 'Object.defineProperties' in that specification. |
Standard | Початкове визначення. Реалізоване у JavaScript 1.8.5 |
Сумісність з веб-переглядачами
BCD tables only load in the browser