Objetos em JavaScript
1. Introdução aos Objetos
Em JavaScript, um objeto é um valor composto, que permite agrupar múltiplos valores (sejam primitivos ou outros objetos) em uma única estrutura. Esses valores são armazenados como propriedades, que possuem nome e valor associados.
Dessa forma, um objeto pode ser visto como uma coleção não ordenada de propriedades, em que cada chave é única.
let pessoa = {
nome: "Ana",
idade: 25,
estudante: true
};
console.log(pessoa.nome); // "Ana"
console.log(pessoa.idade); // 25
Objetos funcionam como mapas de strings para valores. Contudo, eles vão além disso:
- Todo objeto herda propriedades de outro objeto, chamado de protótipo.
- Esse mecanismo é chamado de herança prototípica, uma das principais características do JavaScript.
- Objetos são dinâmicos, ou seja, é possível adicionar, alterar ou remover propriedades em tempo de execução.
Qualquer valor em JavaScript que não seja string, number, boolean, symbol, null ou undefined é considerado um objeto.
2. Criando Objetos
Existem diferentes formas de criar objetos em JavaScript.
2.1. Object Literal
O modo mais simples é usando literais de objeto, com chaves {}:
let carro = {
marca: "Toyota",
modelo: "Corolla",
ano: 2020
};
console.log(carro.marca); // "Toyota"
Sempre que o literal é avaliado, um novo objeto distinto é criado.
2.2. Criando Objetos com new
Outra forma é usar o operador new junto a uma função construtora:
function Pessoa(nome, idade) {
this.nome = nome;
this.idade = idade;
}
let joao = new Pessoa("João", 30);
console.log(joao.nome); // "João"
Aqui, a função Pessoa atua como construtor, inicializando o novo objeto.
2.3. Usando Object.create()
O método Object.create() permite criar um novo objeto a partir de um protótipo específico:
let animal = { tipo: "mamífero" };
let gato = Object.create(animal);
gato.nome = "Mimi";
console.log(gato.nome); // "Mimi"
console.log(gato.tipo); // "mamífero" (herdado do protótipo)
Podemos até criar objetos sem protótipo:
let objSemProto = Object.create(null);
console.log(Object.getPrototypeOf(objSemProto)); // null
3. Propriedades
Cada propriedade em um objeto possui nome (ou chave) e valor.
-
É possível acessar propriedades de duas formas:
- Notação de ponto:
obj.propriedade - Notação de colchetes:
obj["propriedade"]
- Notação de ponto:
let livro = { titulo: "JS Definitivo", autor: "David Flanagan" };
console.log(livro.titulo); // "JS Definitivo"
console.log(livro["autor"]); // "David Flanagan"
A notação de colchetes é útil quando a chave da propriedade é dinâmica ou contém caracteres especiais.
Objetos como Arrays Associativos
Objetos JavaScript funcionam como arrays associativos, permitindo criar propriedades em tempo de execução:
let portfolio = {};
let propriedade = "açãoApple";
portfolio[propriedade] = 5000;
console.log(portfolio["açãoApple"]); // 5000
4. Herança de protótipo
Cada objeto possui um protótipo, de onde herda propriedades e métodos.
let pessoa = { nome: "Carlos" };
console.log(pessoa.toString()); // herdado de Object.prototype
A relação entre objetos e seus protótipos forma a chamada cadeia de protótipos (prototype chain).
Exemplo com herança:
let animal = { tipo: "mamífero" };
let cachorro = Object.create(animal);
cachorro.nome = "Rex";
console.log(cachorro.tipo); // "mamífero" (herdado)
5. Erros de Acesso a Propriedades
Nem sempre acessar ou definir propriedades funciona como esperado:
- Se a propriedade não existe, o resultado é
undefined:
let obj = {};
console.log(obj.inexistente); // undefined
nulleundefinednão possuem propriedades. Tentar acessá-las causa erro:
let valor = null;
console.log(valor.prop); // TypeError
- O ES2020 trouxe o operador de encadeamento opcional (
?.), que evita erros:
let usuario = {};
console.log(usuario.endereco?.rua); // undefined (sem erro)
6. Restrições na Atribuição de Propriedades
Nem sempre é possível modificar uma propriedade:
- Se for somente leitura (read-only).
- Se o objeto não for extensível (
Object.preventExtensions()). - Se a propriedade for herdada e imutável.
Em modo estrito, tentar modificar nesses casos lança um TypeError.
"use strict";
let obj = {};
Object.defineProperty(obj, "fixo", { value: 10, writable: false });
obj.fixo = 20; // TypeError
Conclusão
- Objetos em JavaScript são coleções dinâmicas de propriedades.
- Podem ser criados com literais
{},new, ouObject.create(). - Permitem acesso por
.ou[]. - São mutáveis e comparados por referência.
- Possuem herança prototípica via cadeia de protótipos.
- Propriedades podem ser configuradas como writable, enumerable, configurable.
- O acesso a propriedades inexistentes retorna
undefined.