--- title: Object.defineProperties() slug: Web/JavaScript/Reference/Global_Objects/Object/defineProperties tags: - ECMAScript5 - JavaScript - JavaScript 1.8.5 - Method - Object - Reference - Référence(2) - polyfill translation_of: Web/JavaScript/Reference/Global_Objects/Object/defineProperties ---
Метод Object.defineProperties() определяет новые или изменяет существующие свойства, непосредственно на объекте, возвращая этот объект.
Object.defineProperties(obj, props)
objpropsconfigurabletrue только в том случае, если тип этого дескриптора свойства может быть изменён и если свойство может быть удалено из содержащего его объекта.false.enumerabletrue только в том случае, если это свойство можно увидеть через перечисление свойств содержащего его объекта.false.valuewritabletrue только в том случае, если значение, ассоциированное со свойством, может быть изменено с помощью {{jsxref("Operators/Assignment_Operators", "оператора присваивания", "", 1)}}.false.getsetОбъект, переданный в функцию.
Метод Object.defineProperties(), по сути, определяет все свойства, соответствующие собственным свойствам объекта props, на объекте obj.
Object.defineProperties(obj, {
'property1': {
value: true,
writable: true
},
'property2': {
value: 'Hello',
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) {
// NB: изменить при необходимости считать вызываемым что-то ещё, кроме функций.
return typeof v === 'function';
}
if (typeof desc !== 'object' || desc === null) {
throw new TypeError('bad desc');
}
var d = {};
if (hasProperty(desc, 'enumerable')) {
d.enumerable = !!obj.enumerable;
}
if (hasProperty(desc, 'configurable')) {
d.configurable = !!obj.configurable;
}
if (hasProperty(desc, 'value')) {
d.value = obj.value;
}
if (hasProperty(desc, 'writable')) {
d.writable = !!desc.writable;
}
if (hasProperty(desc, 'get')) {
var g = desc.get;
if (!isCallable(g) && g !== 'undefined') {
throw new TypeError('bad get');
}
d.get = g;
}
if (hasProperty(desc, 'set')) {
var s = desc.set;
if (!isCallable(s) && 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;
}
{{Compat}}