Object.defineProperties()

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.

O método Object.defineProperties() define uma nova propriedade ou modifica uma existente no objeto, retornando o objeto.

Sintaxe

Object.defineProperties(obj, props)

Parâmetros

obj

O objeto no qual se cria ou modifica suas propriedades.

props

Um objeto do qual propriedades enumeráveis constitui descritores para as propriedades serem definidas ou modificadas. Descritores de propriedade presente nos objetos provém em dois principais tipos: descritores de dados e de acesso (veja Object.defineProperty() para mais detalhes). Descritores têm as seguintes chaves:

configurable

true se e somente se o tipo deste descritor de propriedades pode ser modificada e se a propriedade pode ser apagada do objeto correspondente. Valor padrão é false.

enumerable

true se e somente se este propriedade aparece durante enumeração das propriedade sobre o objeto correspondente. Valor padrão é false.

value

O valor associado com a propriedade. Pode ser qualquer valor válido em JavaScript value (número, objeto, função, etc). Valor padrão é undefined.

writable

true se e somente se o valor associado com a propriedade pode ser modificada com um assignment operator. Valor padrão é false.

get

Uma função a qual serve com um getter para a propriedade, ou undefined se não existe getter. A retorno da função será usado como o valor da propriedade. Valor padrão é undefined.

set

Uma função a qual server com um setter para a propriedade, ou undefined se não existe setter. A função receberá como argumento somente o novo valor sendo atribuído à propriedade. Valor padrão é undefined.

Valor de retorno

O objeto que foi passado para a função.

Descrição

Object.defineProperties, em essência, define todas as propriedades correspondentes para as propriedades próprias enumeráveis de props sobre o objeto obj.

Exemplo

js
var obj = {};
Object.defineProperties(obj, {
  property1: {
    value: true,
    writable: true,
  },
  property2: {
    value: "Hello",
    writable: false,
  },
  // etc. etc.
});

Polyfill

Assumindo uma execução intocada com todos os nomes e propriedades referindo para seus valores iniciais, Object.defineProperties é quase completamente equivalente (note o comentário em isCallable) para a seguinte reimplementação em JavaScript:

js
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;
}

Especificações

Specification
ECMAScript Language Specification
# sec-object.defineproperties

Compatibilidade com navegadores

BCD tables only load in the browser

Veja também