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!

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)

Ver tambi茅n