The Object.defineProperties()
method defines new or modifies existing properties directly on an object, returning the object.
Object.defineProperties(obj, props)
obj
props
Object.defineProperty()
for more details). Descriptors have the following keys:configurable
true
if and only if the type of this property descriptor may be changed and if the property may be deleted from the corresponding object.false
.
enumerable
true
if and only if this property shows up during enumeration of the properties on the corresponding object.false
.
value
undefined
.
writable
true
if and only if the value associated with the property may be changed with an assignment operator.false
.
get
undefined
if there is no getter. The function return will be used as the value of property.undefined
.
set
undefined
if there is no setter. The function will receive as only argument the new value being assigned to the property.undefined
.
The object that was passed to the function.
Object.defineProperties
, in essence, defines all properties corresponding to the enumerable own properties of props
on the object obj
object.
var obj = {}; Object.defineProperties(obj, { 'property1': { value: true, writable: true }, 'property2': { value: 'Hello', writable: false } // etc. etc. });
Assuming a pristine execution environment with all names and properties referring to their initial values, Object.defineProperties
is almost completely equivalent (note the comment in isCallable
) to the following reimplementation in JavaScript:
function defineProperties(obj, properties) { function convertToDescriptor(desc) { function hasProperty(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } function isCallable(v) { // NB: modify as necessary if other values than functions are callable. 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; }
Specification | Status | Comment |
---|---|---|
ECMAScript 5.1 (ECMA-262) The definition of 'Object.defineProperties' in that specification. | Standard | Initial definition. Implemented in JavaScript 1.8.5 |
ECMAScript 2015 (6th Edition, ECMA-262) The definition of 'Object.defineProperties' in that specification. | Standard | |
ECMAScript 2017 Draft (ECMA-262) The definition of 'Object.defineProperties' in that specification. | Draft |
Feature | Firefox (Gecko) | Chrome | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Basic support | 4.0 (2) | 5 | 9 | 11.60 | 5 |
Feature | Firefox Mobile (Gecko) | Android | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|
Basic support | 4.0 (2) | (Yes) | ? | 11.5 | (Yes) |
© 2005–2017 Mozilla Developer Network and individual contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperties