Objetos em JavaScript
Objetos são a estrutura de dados mais essencial em JavaScript. Pense neles como cartões de informações — a frente diz "Nome: Alice" e o verso diz "Idade: 20". Cada informação tem uma chave e um valor, formando um par chave-valor.
📖 Resumo
Criando Objetos Literais
Use chaves {} para escrever um objeto diretamente — esta é a abordagem mais comum:
<script>
const student = {
name: "Alice",
age: 20,
major: "Ciência da Computação"
};
console.log(student);
</script>
Pares chave-valor são separados por dois-pontos, e os pares são separados por vírgulas. Uma vírgula trailing após o último par é permitida (e conveniente para adições futuras).
Acessando Propriedades
Duas maneiras de acessar propriedades de objetos:
| Método | Sintaxe | Quando Usar |
|---|---|---|
| Notação de ponto | obj.nome |
Quando o nome da propriedade é um identificador válido |
| Notação de colchetes | obj["nome"] |
Quando o nome contém caracteres especiais ou está armazenado em uma variável |
A maior vantagem da notação de colchetes: você pode usar uma variável como chave.
<script>
const key = "name";
console.log(student[key]); // Mesmo que student["name"]
</script>
Modificando e Adicionando Propriedades
Após criar um objeto, você pode modificar propriedades existentes ou adicionar novas a qualquer momento — mesmo que o objeto tenha sido declarado com const (const bloqueia a referência, não o conteúdo).
<script>
student.age = 21; // Modificar
student.grade = "Júnior"; // Adicionar nova propriedade
console.log(student);
</script>
Deletando Propriedades
Use o operador delete para remover uma propriedade completamente:
<script>
delete student.grade;
console.log(student);
</script>
Após a deleção, acessar aquela propriedade retorna undefined.
Métodos
Uma função dentro de um objeto é chamada de método. Quando uma função se torna o valor de uma propriedade, o objeto pode "fazer coisas":
<script>
const dog = {
name: "Rex",
bark() {
return "Au! Eu sou " + this.name;
}
};
console.log(dog.bark());
</script>
A Palavra-chave this
this se refere ao "objeto atual" — quem chama o método, this é aquele objeto. Este é um dos conceitos mais complicados do JavaScript: se um método for extraído e chamado separadamente, this não apontará mais para o objeto original.
<script>
const bark = dog.bark;
console.log(bark()); // this não aponta mais para dog — pode ser window ou undefined
</script>
Construtores
Quando você precisa criar múltiplos objetos com a mesma estrutura, use uma função construtora:
<script>
function Person(name, age) {
this.name = name;
this.age = age;
this.sayHi = function() {
return "Olá, eu sou " + this.name;
};
}
const p1 = new Person("Bob", 25);
const p2 = new Person("Charlie", 30);
console.log(p1.sayHi());
console.log(p2.sayHi());
</script>
new faz três coisas: cria um objeto vazio → define this para apontar para ele → retorna o objeto.
Object.keys / values / entries
Esses três métodos estáticos retornam arrays das chaves, valores e pares chave-valor de um objeto:
| Método | Retorna |
|---|---|
Object.keys(obj) |
["name", "age"] |
Object.values(obj) |
["Alice", 20] |
Object.entries(obj) |
[["name","Alice"], ["age",20]] |
Muito útil para iterar sobre objetos: Object.keys(obj).forEach(key => ...).
Exemplo: Criando um Objeto de Aluno e Exibindo Informações
<!DOCTYPE html>
<html lang="pt-br">
<head>
<meta charset="UTF-8">
<title>Fundamentos de Objetos</title>
<style>
body { font-family: sans-serif; padding: 20px; }
.card { border: 2px solid #4a90d9; border-radius: 8px; padding: 16px; max-width: 360px; background: #f0f7ff; }
.card h3 { margin: 0 0 8px; color: #4a90d9; }
.card p { margin: 4px 0; }
</style>
</head>
<body>
<h2>Cartão de Informações do Aluno</h2>
<div id="output"></div>
<script>
const student = {
name: "Alice",
age: 20,
major: "Ciência da Computação",
gpa: 3.7,
introduce() {
return `Meu nome é ${this.name}, tenho ${this.age} anos, curso ${this.major} com CRA de ${this.gpa}.`;
}
};
const output = document.getElementById("output");
output.innerHTML = `
<div class="card">
<h3>${student.name}</h3>
<p>Idade: ${student.age}</p>
<p>Curso: ${student.major}</p>
<p>CRA: ${student.gpa}</p>
<p><em>${student.introduce()}</em></p>
</div>
`;
</script>
</body>
</html>
Exemplo: Notação de Ponto vs Notação de Colchetes
<!DOCTYPE html>
<html lang="pt-br">
<head>
<meta charset="UTF-8">
<title>Métodos de Acesso a Propriedades</title>
<style>
body { font-family: sans-serif; padding: 20px; }
.result { background: #f5f5f5; padding: 12px; border-radius: 6px; margin: 8px 0; }
code { background: #e0e0e0; padding: 2px 6px; border-radius: 3px; }
</style>
</head>
<body>
<h2>Comparação de Acesso a Propriedades</h2>
<div id="output"></div>
<script>
const user = {
name: "Bob",
age: 28,
"home-city": "São Paulo"
};
const key = "name";
const results = [];
results.push(`user.name → ${user.name}`);
results.push(`user["name"] → ${user["name"]}`);
results.push(`user[key](key="name") → ${user[key]}`);
results.push(`user["home-city"] → ${user["home-city"]}`);
document.getElementById("output").innerHTML = results
.map(r => `<div class="result"><code>${r}</code></div>`)
.join("");
</script>
</body>
</html>
Exemplo: Adicionando, Modificando e Deletando Propriedades Dinamicamente
<!DOCTYPE html>
<html lang="pt-br">
<head>
<meta charset="UTF-8">
<title>Trabalhando com Propriedades</title>
<style>
body { font-family: sans-serif; padding: 20px; }
table { border-collapse: collapse; margin: 12px 0; }
td, th { border: 1px solid #ccc; padding: 8px 14px; text-align: left; }
th { background: #4a90d9; color: #fff; }
.action { color: #888; font-style: italic; margin: 8px 0; }
</style>
</head>
<body>
<h2>Operações com Propriedades de Objetos</h2>
<div id="output"></div>
<script>
const product = { name: "Notebook", price: 4999 };
const log = [];
function showState(label) {
log.push({ label, snapshot: JSON.stringify(product) });
}
showState("Estado inicial");
product.price = 4499;
showState("Preço alterado para 4499");
product.brand = "Lenovo";
showState("Propriedade brand adicionada");
delete product.brand;
showState("Propriedade brand deletada");
const output = document.getElementById("output");
output.innerHTML = "<table><tr><th>Ação</th><th>Estado do Objeto</th></tr>" +
log.map(r => `<tr><td>${r.label}</td><td>${r.snapshot}</td></tr>`).join("") +
"</table>";
</script>
</body>
</html>
Exemplo: Construtores e Object.keys/values/entries
<!DOCTYPE html>
<html lang="pt-br">
<head>
<meta charset="UTF-8">
<title>Construtores e Métodos de Objeto</title>
<style>
body { font-family: sans-serif; padding: 20px; }
.section { margin: 16px 0; padding: 12px; background: #f9f9f9; border-radius: 6px; }
.section h3 { margin-top: 0; color: #4a90d9; }
ul { padding-left: 20px; }
li { margin: 4px 0; }
</style>
</head>
<body>
<h2>Construtores e Métodos Estáticos de Objeto</h2>
<div id="output"></div>
<script>
function Phone(brand, model, price) {
this.brand = brand;
this.model = model;
this.price = price;
this.showInfo = function() {
return `${this.brand} ${this.model} — R$${this.price}`;
};
}
const p1 = new Phone("Samsung", "Galaxy S24", 4999);
const p2 = new Phone("Apple", "iPhone 15", 5999);
const keys = Object.keys(p1);
const values = Object.values(p1);
const entries = Object.entries(p1);
document.getElementById("output").innerHTML = `
<div class="section">
<h3>Objetos Criados com Construtor</h3>
<p>${p1.showInfo()}</p>
<p>${p2.showInfo()}</p>
</div>
<div class="section">
<h3>Object.keys(p1)</h3>
<ul>${keys.map(k => `<li>${k}</li>`).join("")}</ul>
</div>
<div class="section">
<h3>Object.values(p1)</h3>
<ul>${values.map(v => `<li>${v}</li>`).join("")}</ul>
</div>
<div class="section">
<h3>Object.entries(p1)</h3>
<ul>${entries.map(([k, v]) => `<li><code>${k}</code>: <code>${v}</code></li>`).join("")}</ul>
</div>
`;
</script>
</body>
</html>
❓ Perguntas Frequentes
P:Posso modificar propriedades de um objeto declarado com
const? R:Sim.constbloqueia a referência da variável (significando que ela sempre aponta para o mesmo objeto), não o conteúdo do objeto. Você pode adicionar, modificar e deletar propriedades livremente — mas não pode reatribuir comobj = {}.
P:Quando devo usar notação de colchetes em vez de notação de ponto? R:Quando o nome da propriedade contém espaços ou hífens (como
"home-city"), ou quando o nome está armazenado em uma variável para acesso dinâmico, você deve usar colchetes. Para tudo mais, a notação de ponto é mais limpa e preferida.
P:O que acontece se eu esquecer
newcom um construtor? R:thisapontará para o objeto global (ouundefinedno modo estrito), fazendo com que as propriedades vão para o lugar errado ou lancem um erro. Esta é uma armadilha clássica — a sintaxeclassdo ES6 lida com isso automaticamente.
📝 Atividades
- Crie um objeto
livrocom propriedadestitulo,autoreano, além de um métodogetSummary()que retorna uma string como"titulo por autor, publicado em ano". - Escreva um construtor
Carro(marca, modelo, ano), use-o para criar 3 carros, depois useObject.keyspara listar todos os nomes de propriedades de um carro. - Adicione dinamicamente um método
dirigir()a qualquer um dos carros acima (retorna"marca modelo está dirigindo"), depois chame-o. Observe comothisse refere ao objeto atual dentro do método.



