Esta tradução está incompleta. Por favor, ajude a traduzir este artigo.

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

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:

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

Especificação Status Comentário
ECMAScript 5.1 (ECMA-262)
The definition of 'Object.defineProperties' in that specification.
Padrão Definição inicial. Implementada no JavaScript 1.8.5
ECMAScript 2015 (6th Edition, ECMA-262)
The definition of 'Object.defineProperties' in that specification.
Padrão  
ECMAScript Latest Draft (ECMA-262)
The definition of 'Object.defineProperties' in that specification.
Rascunho  

Compatibilidade de navegadores

Estamos convertendo nossos dados de compatibilidade para o formato JSON. Esta tabela de compatibilidade ainda usa o formato antigo, pois ainda não convertemos os dados que ela contém. Descubra como você pode ajudar!
Feature Firefox (Gecko) Chrome Edge Internet Explorer Opera Safari
Suporte básico 4.0 (2) 5 (Yes) 9 11.60 5
Característica Firefox Mobile (Gecko) Android Edge IE Mobile Opera Mobile Safari Mobile
Suporte básico 4.0 (2) (Yes) (Yes) ? 11.5 (Yes)

Veja também

Etiquetas do documento e colaboradores

Colaboradores desta página: KyryIx, LucianoDos
Última atualização por: KyryIx,