[ Web Proxy ]
URL:
Viewing: https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Operators/Object_initializer [Back]  [Original]

Inicializador de Objeto - JavaScript | MDN

Esta pgina foi traduzida do ingls pela comunidade. Saiba mais e junte-se comunidade MDN Web Docs.

View in English Always switch to English

Inicializador de Objeto

Baseline Widely available

This feature is well established and works across many devices and browser versions. Its been available across browsers since julho de 2015.

Objetos podem ser inicializados utilizando new Object(), Object.create(), ou a notao literal. Um inicializador de objetos uma lista de zero ou mais pares de propriedade: valor, separados por vrgula e fechado por um par de chaves ({}).

In this article

Sintaxe

js
var o = {};
var o = { a: "foo", b: 42, c: {} };

var a = "foo",
  b = 42,
  c = {};
var o = { a: a, b: b, c: c };

var o = {
  propriedade: function ([parmetros]) {},
  get propriedade() {},
  set propriedade(valor) {},
};

Novas notaes em ECMAScript 2015

Por favor, verifique o suporte das anotaes na tabela de compatibilidade. Em ambientes que no do suporte s anotaes, ocorrer erros de sintaxe.

js
// // Abreviao em nomes de propriedades (ES2015)
var a = "foo",
  b = 42,
  c = {};
var o = { a, b, c };

// // Abreviao em nomes de mtodos (ES2015)
var o = {
  property([parameters]) {},
  get property() {},
  set property(value) {},
};

// Nomes de propriedades computados (ES2015)
var prop = "foo";
var o = {
  [prop]: "hey",
  ["b" + "ar"]: "there",
};

Descrio

Um inicializador de objetos uma expresso que descreve a inicializao de um Object. Objects consiste de propriedades, as quais descrevem um objeto. Os valores das propriedades de um objeto podem ser tipos de dados primitivos ou outros objetos .

Criando objetos

Um objeto vazio, sem propriedades, pode ser criado como:

js
var object = {};

Contudo, a vantagem em utilizar a notao literal ou o inicializador a possibilidade de rapidamente criar objetos com propriedades dentro de chaves ({}). Voc simplesmente cria uma lista de pares chave: valor, separados por vrgula. O cdigo abaixo cria um objeto com trs propriedades, sendo as chaves "foo", "age" e "baz", com seus respectivos valores, tipo string de valor "bar", tipo number de valor 42 e, por ltimo, um outro objeto com seus respectivos pares de chave: valor.

js
var object = {
  foo: "bar",
  age: 42,
  baz: { myProp: 12 },
};

Acessando propriedades

Uma vez que voc criou um objeto, interessante que possa ler ou alter-lo. As propriedades de um objeto podem ser acessadas utilizando a notao de ponto ou colchetes. Veja assessores de propriedade para mais informaes.

js
object.foo; // "bar"
object["age"]; // 42

object.foo = "baz";

Definies de propriedade

Ns temos aprendido como descrever propriedades utilizando a sintaxe inicializador. No entanto, s vezes, h variveis que queremos inserir em nosso objeto. Ento teremos um cdigo parecido como abaixo:

js
var a = "foo",
  b = 42,
  c = {};

var o = {
  a: a,
  b: b,
  c: c,
};

Com ECMAScript 2015, h uma notao mais curta que possibilita atingir o mesmo resultado:

js
var a = "foo",
  b = 42,
  c = {};

// Abreviao em nomes de propriedades (ES2015)
var o = { a, b, c };

// Em outras palavras,
console.log(o.a === { a }.a); // true

Duplicao em nomes de propriedades

Quando se est utilizando o mesmo nome para suas propriedades, a ltima sobrescrever as anteriores.

js
var a = { x: 1, x: 2 };
console.log(a); // { x: 2}

Em cdigos ECMAScript 5 no modo estrito, duplicao em nomes de propriedades sero consideradas SyntaxError. Porm, com a introduo de "nomes de propriedades computadas", tornou-se possvel a duplicao das propriedades em tempo de execuo. Assim, ECMAScript 2015 removeu a restrio.

js
function haveES2015DuplicatePropertySemantics() {
  "use strict";
  try {
    ({ prop: 1, prop: 2 });

    // No error thrown, duplicate property names allowed in strict mode
    return true;
  } catch (e) {
    // Error thrown, duplicates prohibited in strict mode
    return false;
  }
}

Definio de mtodos

Uma propriedade de um objeto pode se referir function, ou aos mtodos getter ou setter.

js
var o = {
  propriedade: function ([parmetros]) {},
  get propriedade() {},
  set propriedade(valor) {},
};

No ECMAScript 2015, uma notao abreviada est disponvel, dispensando o uso da palavra reservada "function".

js
// Abreviaes em nomes de mtodos (ES2015)
var o = {
  propriedade([parmetros]) {},
  get propriedade() {},
  set propriedade(valor) {},
  *gerador() {},
};

Com ECMAScript 2015, h uma forma concisa em criar propriedades cujo valor uma funo gerador.

js
var o = {
  * gerador() {
    ...........
  }
};

Mas em ECMAScript 5, voc escreveria (lembrar que em ES5 no h geradores):

js
var o = {
  generator: function *() {
    ...........
  }
};

Para mais informaes e exemplos, veja definies de mtodo.

Nomes de propriedades computados

Comeando com ECMAScript 2015, a sintaxe inicializador de objeto tambm suporta "nomes de propriedades computados". Isso permite que voc possa inserir uma expresso dentro de colchetes [], que ser computada como o nome de uma propriedade. Isto semelhante notao de chaves utilizado em acessor de propriedade, utilizado para ler a alterar as propriedades existentes em um objeto. Segue um exemplo utilizando a mesma sintaxe em objetos literais:

js
// Nomes de propriedades computados (ES2015)
var i = 0;
var a = {
  ["foo" + ++i]: i,
  ["foo" + ++i]: i,
  ["foo" + ++i]: i,
};

console.log(a.foo1); // 1
console.log(a.foo2); // 2
console.log(a.foo3); // 3

var param = "size";
var config = {
  [param]: 12,
  ["mobile" + param.charAt(0).toUpperCase() + param.slice(1)]: 4,
};

console.log(config); // { size: 12, mobileSize: 4 }

Mutao Prototype

Uma definio de propriedade na forma de __proto__: valor or "__proto__": valor no cria uma propriedade com o nome __proto__. Inclusive, se o valor fornecido for um objeto ou null, muda o [[Prototype]] do objeto criado para o valor informado. (Se o valor fornecido no um objeto ou null, o valor no ser alterado.)

js
var obj1 = {};
assert(Object.getPrototypeOf(obj1) === Object.prototype);

var obj2 = { __proto__: null };
assert(Object.getPrototypeOf(obj2) === null);

var protoObj = {};
var obj3 = { __proto__: protoObj };
assert(Object.getPrototypeOf(obj3) === protoObj);

var obj4 = { __proto__: "not an object or null" };
assert(Object.getPrototypeOf(obj4) === Object.prototype);
assert(!obj4.hasOwnProperty("__proto__"));

Apenas uma nica mudana em prototype permitida em um objeto: mltiplas mudanas gera erro de sintaxe.

Definies de propriedade que no utilizam da notao de ":", no so consideradas mudanas de prototype: so definies de propriedades que se comportam de forma semelhante s definies utilizando qualquer outro nome.

js
var __proto__ = "variable";

var obj1 = { __proto__ };
assert(Object.getPrototypeOf(obj1) === Object.prototype);
assert(obj1.hasOwnProperty("__proto__"));
assert(obj1.__proto__ === "variable");

var obj2 = {
  __proto__() {
    return "hello";
  },
};
assert(obj2.__proto__() === "hello");

var obj3 = { ["__prot" + "o__"]: 17 };
assert(obj3.__proto__ === 17);

Notao de objeto literal vs JSON

A notao de objeto literal no a mesma de JavaScript Object Notation (JSON). Mesmo que possuam semelhanas, h as seguintes diferenas:

  • JSON permite definies de propriedades utilizando apenas aspas duplas, como "propriedade": valor. E a definio no pode ser abreviada.
  • Os valores JSON podem ser apenas strings, numbers, arrays, true, false, null, ou outro objeto JSON.
  • Uma funo como valor (veja "Mtodos" acima) no pode ser atribuido em JSON.
  • Objetos como Date sero do tipo string aps JSON.parse().
  • JSON.parse() rejeitar "nomes de propriedades computados" e um erro ser lanado.

Especificaes

Specification
ECMAScript 2027 LanguageSpecification
# sec-object-initializer

Compatibilidade com navegadores

Veja tambm


Web Proxy Viewer  |  New URL  |  Original Page