Сводка
Метод Object.defineProperties()
определяет новые или изменяет существующие свойства, непосредственно на объекте, возвращая этот объект.
Синтаксис
Object.defineProperties(obj, props)
Параметры
obj
- Объект, на котором определяются новые или изменяются существующие свойства.
props
-
Объект, чьи собственные перечисляемые свойства представляют собой дескрипторы для создаваемых или изменяемых свойств. Дескрипторы свойств обладают следующими дополнительными ключами:
configurable
-
Равен
true
только в том случае, если тип этого дескриптора свойства может быть изменён и если свойство может быть удалено из содержащего его объекта.
Значение по умолчанию установлено вfalse
. enumerable
-
Равен
true
только в том случае, если это свойство можно увидеть через перечисление свойств содержащего его объекта.
Значение по умолчанию установлено вfalse
. value
-
Значение, ассоциированное со свойством. Может быть любым допустимым значением JavaScript (числом, объектом, функцией и т.д.).
Значение по умолчанию установлено вundefined
. writable
-
Равен
true
только в том случае, если значение, ассоциированное со свойством, может быть изменено с помощью оператора присваивания.
Значение по умолчанию установлено вfalse
. get
-
Функция, используемая как геттер свойства, либо
undefined
, если свойство не имеет геттера. Возвращаемое значение функции будет использоваться как значение свойства.
Значение по умолчанию установлено вundefined
. set
-
Функция, используемая как сеттер свойства, либо
undefined
, если свойство не имеет сеттера. Функция принимает единственным аргументом новое значение, присваиваемое свойству.
Значение по умолчанию установлено вundefined
.
Описание
Метод 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; }
Спецификации
Спецификация | Статус | Комментарии |
---|---|---|
ECMAScript 5.1 (ECMA-262) Определение 'Object.defineProperties' в этой спецификации. |
Стандарт | Изначальное определение. Реализована в JavaScript 1.8.5. |
ECMAScript 6 (ECMA-262) Определение 'Object.defineProperties' в этой спецификации. |
Кандидат в рекомендации |
Совместимость с браузерами
Возможность | Firefox (Gecko) | Chrome | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Базовая поддержка | 4.0 (2) | 5 (предыдущие версии не проверялись) | 9 | 11.60 | 5 |
Возможность | Firefox Mobile (Gecko) | Android | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|
Базовая поддержка | 4.0 (2) | (Да) | ? | 11.50 | (Да) |
На основе таблицы совместимости Kangax.