Object.defineProperties()
Sumario
El metodo Object.defineProperties()
define nuevas o modifica propiedades existentes directamente en el objeto, retornando el objeto.
Sintáxis
Object.defineProperties(obj, propiedades)
Parámetros
- obj
- El objeto sobre el cual se crearán o modificaran sus propiedades.
- propiedades
- Un objeto cuyas propiedades enumerables propias consituyen descriptores para las propiedades a ser definidas o modificadas.
Descripción
Object.defineProperties
, en escencia, define todas las propiedades correspondientes a las propiedades propias con capacidad de enumeración de props
en el objeto objrops.
Ejemplo
Object.defineProperties(obj, {
"property1": {
value: true,
writable: true
},
"property2": {
value: "Hello",
writable: false
}
// etc. etc.
});
Polyfill
Asumiendo una ejecución pristina del entorno con todos los nombres y propiedades referidas a sus valores iniciales, Object.defineProperties
es casi completamente equivalente (note el comentario en isCallable
) a la siguiente reimplementación de 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 = !!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;
}
Especificaciones
Especificación | Estado | Comentario |
---|---|---|
ECMAScript 5.1 (ECMA-262) La definición de 'Object.defineProperties' en esta especificación. |
Standard | Definición inicial. Implementada en JavaScript 1.8.5 |
ECMAScript 2015 (6th Edition, ECMA-262) La definición de 'Object.defineProperties' en esta especificación. |
Standard |
Compatibilidad de navegadores
Basado en Kangax's compat tables.
We're converting our compatibility data into a machine-readable JSON format.
This compatibility table still uses the old format,
because we haven't yet converted the data it contains.
Find out how you can help! (en-US)
Caracteristica | Firefox (Gecko) | Chrome | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Soporte básico | 4.0 (2) | 5 (previous versions untested) | 9 | 11.60 | 5 |
Caracteristica | Firefox Mobile (Gecko) | Android | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|
Soporte básico | 4.0 (2) | (Yes) | ? | 11.50 | (Yes) |