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?
Qual das seguintes opções é a sintaxe correta para obter o valor
de myProp
myObj["myProp"];
myObj{"myProp"};
myObj("myProp");