Objetos

Os objetos são um tipo de dados discreto, da mesma forma que cada um primitivo é um tipo de dados, com uma camada crítica diferença: ao contrário dos primitivos, os objetos são mutáveis. Um objeto pode conter dados associada a identificadores, como uma variável, mas mantém os dados de object; independentemente dos dados contidos nele.

Além dos primitivos, todos os valores JavaScript são objetos, já que mesmo literais primitivos exibem comportamento semelhante a um objeto devido ao herança de protótipo, é costumam dizer que o JavaScript é efetivamente composto de objetos.

Um literal de objeto é um par de chaves em torno de zero ou mais chave-valor chamados de "propriedades", que pode conter qualquer valor JavaScript.

{
    "myProperty" : true
}

As chaves de propriedade podem ser qualquer símbolo ou string. Como ao atribuir um identificador a uma variável, as strings usadas como chaves de propriedade devem ser previsíveis descritivo:

let carAttributes = {
    "color" : "red"
};

carAttributes
> Object { color: "red" }

As chaves de propriedade exigem um literal de string simples (') ou dupla ("), e não um literal de modelo:

let carAttributes = {
    `keyString` : false
};
> Uncaught SyntaxError: expected property name, got template literal

Os valores de propriedade podem ser de qualquer tipo de dados. As propriedades de um objeto podem por si só contêm objetos com as próprias propriedades:

let myObject = {
    'key' : {
        'subkey' : true,
        'othersubkey' : false
    }
};

myObject;
> Object { key: Object { subkey: true, othersubkey: false } }

Quando o valor de uma propriedade é uma função, essa propriedade é chamada de "método".

const myObject = {
    "myProperty" : true,
    myMethod() {
        console.log( "This is a method." );
    }
}

myObject.myProperty;
> true

myObject.myMethod();
> "This is a method."

Também é possível criar um objeto usando a palavra-chave new:

let myObject = new Object();

Nos exemplos anteriores, os literais de objeto recém-criados foram atribuídos às variáveis. Isso não é necessário porque, como em qualquer outro tipo de dado, você pode usar um objeto sem um identificador em qualquer lugar em que um objeto é esperado. No entanto, um objeto literal requer parênteses em qualquer contexto em que possa ser confundido para uma instrução de bloco, já que os dois compartilham a sintaxe de chaves ({}). Inicializar uma variável nunca exige isso.

{ "value" : 2 }
> Uncaught SyntaxError: unexpected token: ':'

({ "value" : 2 })
> Object { value: 2 }

let valObj = { "value" : 2 };

valObj;
> Object { value: 2 }

Ao contrário dos primitivos, não há diferença significativa nos resultados da criação um objeto usando new Object() e criando um literal de objeto, porque o em ambos os casos será um objeto com propriedades herdadas do Protótipo Object. No entanto, há uma diferença prática entre os dois e sintaxes.

A palavra-chave new precisa definir um objeto vazio que será preenchido com dados posteriormente:

let myObject = new Object();

myObject.booleanValue = true;
myObject.stringValue = "My string.";

Um literal de objeto pode ser preenchido com dados quando é criado:

let myObject = {
    'booleanValue' : true,
    'stringValue' : "My string."
};

Embora tenha pouco uso prático, new Object() pode ser usado para transformar componentes valores de dados em objetos dos respectivos tipos, como os retornados usando a palavra-chave new junto com seu construtor função. Por exemplo, o comando a seguir é funcionalmente equivalente a new Number( 10 ):

let myObject = new Object( 10 );

myObject;
> Number { 10 }

Os valores null e undefined resultam em um objeto vazio, funcionalmente idêntico para invocar new Object() sem fornecer um argumento.

Transmitir um literal de objeto para new Object() como um argumento transmite o objeto literal sem alterá-lo:

let myObject = new Object( { myValue : 10 } );

myObject;
> Object { myValue: 10 }

Assim como no uso de construtores para valores primitivos, o uso de construtores para objetos raramente tem benefícios em relação ao uso da notação literal de objeto. Mesmo ao criar objetos vazios sejam preenchidos com valores posteriormente, os desenvolvedores tendem a favorecer o objeto notação literal para simplificar.

Teste seu conhecimento

Que tipos de notação podem ser usados para definir as propriedades de um objeto?

Notação por pontos
Notação por colchetes
Notação de ponto
Notação de linha

Qual das seguintes opções é a sintaxe correta para obter o valor de myProp

myObj["myProp"];
myObj{"myProp"};
myObj("myProp");