JavaScript: desvende objetos de uma vez por todas!

Rocketseat

Navegação Rápida:
Faaala dev! Já parou pra pensar que no JavaScript, quase tudo que você toca é um objeto? Strings, arrays, funções... no fundo, todos eles têm um pezinho no mundo dos objetos. E entender isso não é só um detalhe técnico, é a chave mestra que destrava o próximo nível da sua jornada na programação.
Muitas vezes, quando estamos começando, olhamos para os objetos e vemos apenas um amontoado de chaves e valores. Mas a verdade é que um objeto é muito mais do que isso. Pense nele como um personagem em um jogo de RPG: ele tem características, como nome, nível e classe — que em JS, chamamos de propriedades. E ele também tem habilidades, como
atacar()
, curar()
ou subirDeNivel()
— que são os seus métodos.Reconhecer que objetos são a base para organizar e dar vida ao seu código é um daqueles momentos "clique" que todo dev tem. É o ponto de virada que separa quem apenas escreve linhas de código de quem começa a construir sistemas de verdade, pensando como um arquiteto de software.
Se você já se sentiu um pouco perdido com esse conceito, relaxa. Você está no lugar certo! Nossa missão aqui é te levar diretamente a esse "clique". Vamos mergulhar fundo no que são objetos, por que eles são tão poderosos, como criar os seus e, o mais importante, como dar vida a eles com ações e comportamentos.
Bora desbloquear essa conquista juntos?

O que é um objeto em JavaScript?
No seu nível mais básico, um objeto é uma entidade independente que agrupa dados e funcionalidades relacionadas. Pense nele como um "container" inteligente, uma estrutura de dados que armazena uma coleção de pares chave-valor. A chave (ou nome) é uma string ou um Symbol, e o valor pode ser qualquer coisa: um número, outra string, um booleano, um array e até mesmo outro objeto ou uma função.
Vamos deixar isso mais concreto. Imagine que queremos representar o perfil de um dev aqui da Rocketseat. Poderíamos criar um objeto assim:
// Este é o nosso dev, o Diego! let devProfile = { nome: "Diego Fernandes", apelido: "Diegão", level: 28, techs: ["JavaScript", "React"], ativo: true };
Veja como organizamos todas as informações sobre o Diego em um único lugar.
nome
, apelido
, level
, techs
e ativo
são as propriedades do nosso objeto devProfile
. Cada uma delas guarda um pedaço da identidade do nosso "personagem".Valor vs. referência
Agora, vamos falar sobre algo que causa muita confusão no início, mas que, uma vez entendido, muda o jogo: a diferença entre tipos primitivos e objetos.
Tipos primitivos em JavaScript (
string
, number
, boolean
, null
, undefined
, symbol
, bigint
) são passados por valor. Já os objetos (incluindo arrays
e functions
) são passados por referência.O que isso significa na prática?
Imagine que você tem uma foto. Se você tirar uma xerox e der para um amigo, qualquer coisa que ele fizer na cópia (riscar, cortar) não afeta a sua foto original. Isso é passagem por valor.
Agora, imagine que você tem uma casa. Em vez de dar uma cópia da casa, você dá ao seu amigo a chave da sua casa. Qualquer coisa que ele fizer lá dentro (mudar os móveis de lugar, pintar uma parede) afeta a sua casa original, porque ambos têm acesso ao mesmo lugar. Isso é passagem por referência.
No JavaScript, a variável de um objeto não guarda o objeto em si, mas sim o "endereço" dele na memória — a chave da casa. Bora ver no código?
// Passagem por VALOR (Primitivos) let meuLevel = 50; let levelDoAmigo = meuLevel; // Copiou o valor 50 levelDoAmigo = 55; // Alterou a cópia console.log(meuLevel); // Saída: 50 (O original não mudou!) console.log(levelDoAmigo); // Saída: 55 // Passagem por REFERÊNCIA (Objetos) let meuDev = { nome: "Rodrigo", level: 80 }; let devCompanheiro = meuDev; // Copiou a REFERÊNCIA (a "chave da casa") devCompanheiro.level = 99; // Alterou o objeto original através da referência console.log(meuDev.level); // Saída: 99 (O original MUDOU!) console.log(devCompanheiro.level); // Saída: 99
Entender isso é super importante, pois evita muitos bugs e comportamentos inesperados no seu código. Quando você passa um objeto para uma função e o modifica lá dentro, você está modificando o objeto original!
Para deixar ainda mais lúcido, aqui está uma tabela rápida:
Característica | Tipos primitivos (Ex: string , number ) | Tipos de objeto (Ex: object , array ) |
O que armazena? | Um único valor (Ex: 'Rodrigo' , 30 ) | Uma coleção de valores e funcionalidades |
Como é tratado? | O valor é copiado | A referência é copiada |
Criando e moldando seus objetos
Agora vamos para a parte divertida: colocar a mão no código e começar a construir nossos próprios objetos.
Objeto literal - (clique para expandir):
A maneira mais direta e comum de criar um objeto em JavaScript é usando a sintaxe de objeto literal, que nada mais é do que um par de chaves
{}
. É simples, rápido e você vai usar isso 99% do tempo.A sintaxe é sempre
chave: valor
, com os pares separados por vírgula:const pessoa = { nome: "Isabela", idade: 34 };
Notação de ponto vs. colchetes - (clique para expandir):
Como acessamos as informações guardadas nele? Temos duas ferramentas principais para isso, e saber quando usar cada uma é uma habilidade de dev afiado.
Notação de ponto:
Essa é a forma mais comum, limpa e legível. Você simplesmente usa o nome do objeto, um ponto, e o nome da propriedade que quer acessar. É perfeita para quando você sabe o nome da propriedade e ele é um nome válido em JavaScript (sem espaços, hífens ou caracteres especiais).
console.log(devProfile.nome); // Saída: Diego Fernandes console.log(devProfile.level); // Saída: 28
Notação de colchetes:
Aqui é onde a mágica acontece. A notação de colchetes é uma verdadeira superpotência. Você a utiliza em duas situações principais:
- Quando o nome da propriedade está guardado em uma variável (acesso dinâmico).
- Quando o nome da propriedade contém espaços, hífens ou outros caracteres que não são permitidos na notação de ponto.
// Acesso dinâmico let propriedadeParaAcessar = "apelido"; console.log(devProfile[propriedadeParaAcessar]); // Saída: "Diegão" // Se tentássemos devProfile.propriedadeParaAcessar, o JS procuraria // por uma chave chamada "propriedadeParaAcessar", e não o valor da variável. // O resultado seria `undefined`. // Propriedade com nome "inválido" let relatorio = { "data de criação": "2024-07-26", "id-do-usuario": "abc-123" }; console.log(relatorio["data de criação"]); // Saída: 2024-07-26
Dominar essas duas formas de acesso te dá uma flexibilidade imensa para trabalhar com dados de qualquer formato.
Adicionando, alterando e removendo propriedades - (clique para expandir):
Uma das características mais legais dos objetos em JavaScript é que eles são dinâmicos. Eles não são estruturas rígidas. Você pode adicionar, modificar e remover propriedades a qualquer momento, mesmo depois do objeto ter sido criado.
// Vamos usar nosso devProfile console.log(devProfile); // { nome: 'Diego Fernandes', apelido: 'Diegão',... } // 1. Adicionando uma nova propriedade devProfile.cidade = "São Paulo"; console.log(devProfile.cidade); // Saída: "São Paulo" // 2. Alterando uma propriedade existente devProfile.level = 36; console.log(devProfile.level); // Saída: 36 // 3. Removendo uma propriedade delete devProfile.ativo; console.log(devProfile.ativo); // Saída: undefined
Viu só? Nosso objeto evoluiu! Essa flexibilidade é o que permite que nossas aplicações respondam e se adaptem a novas informações em tempo real.
Funções construtoras - (clique para expandir):
Criar um objeto literal é ótimo para um único perfil. Mas e se precisarmos criar 10, 20, 100 perfis de devs? Copiar e colar o mesmo código várias vezes é uma péssima prática (lembre-se do princípio DRY: Don't Repeat Yourself - Não se Repita).
É aqui que entram as funções construtoras. Elas funcionam como um "molde" ou uma "fábrica" para criar múltiplos objetos do mesmo tipo, de forma padronizada e reutilizável.
Uma função construtora usa duas peças-chave: a palavra-chave
this
, que se refere ao novo objeto que está sendo criado, e o operador new
, que invoca a "fábrica". Por convenção, nomes de funções construtoras começam com letra maiúscula.function Dev(nome, level, techs) { this.nome = nome; this.level = level; this.techs = techs; } // Agora, vamos usar nosso molde para criar novos devs! let devMayk = new Dev("Mayk Brito", 30, "JavaScript"); let devLais = new Dev("Laís Frigerio", 28, "JavaScript"); console.log(devMayk.nome); // Saída: Mayk Brito console.log(devLais.techs); // Saída: JavaScript
Com uma única função, podemos criar quantos objetos
Dev
quisermos, cada um com seus próprios dados, mas todos com a mesma estrutura. Isso é organização e escalabilidade! Se quiser se aprofundar, temos um guia completo sobre funções construtoras que vai te deixar craque no assunto.
Propriedades
Já vimos que propriedades são o coração dos objetos, guardando suas características. Mas podemos ir muito além de simples strings e números. A verdadeira força dos objetos aparece quando começamos a construir estruturas de dados mais complexas.
Uma propriedade de um objeto pode, ela mesma, ser outro objeto! Isso é o que chamamos de aninhamento, e é a base de como a maioria dos dados que você vai consumir de APIs (em formato JSON) é estruturada. Aninhar objetos nos permite criar representações ricas e hierárquicas do mundo real.
Vamos turbinar nosso perfil de dev:
let devProfileAvancado = { nome: "Fatima", level: 40, contato: { // <-- Objeto aninhado email: "fatima@gmail.com", github: "fatima_example", linkedin: "/fatiminha" }, techStack: { // <-- Outro objeto aninhado frontend: ["HTML", "CSS", "React"], backend: ["Node.js", "Elixir"], mobile: ["React Native"] } }; // Para acessar as propriedades aninhadas, simplesmente encadeamos a notação de ponto: console.log(devProfileAvancado.contato.github); // Saída: "fatima_example" console.log(devProfileAvancado.techStack.backend); // Saída: ["Node.js", "Elixir"]
Lembra da nossa notação de colchetes? Ela é a sua ferramenta para quando os nomes das propriedades não seguem as regras de identificadores do JavaScript. Isso é comum quando lidamos com dados de fontes externas.
let relatórioVendas = { "total de vendas": 151278.50, "cliente-id": "xyz-987-abc", "região": "Nordeste", "itens comprados": ["item-1", "item-2"] }; // Acessar com notação de ponto aqui daria erro de sintaxe! // Usamos colchetes com o nome da chave como uma string. console.log(relatórioVendas["total de vendas"]); // Saída: 151278.50 console.log(relatórioVendas["cliente-id"]); // Saída: "xyz-987-abc"
Métodos
Até agora, nossos objetos são como fichas de personagem estáticas. Eles guardam informações, mas não fazem nada. É hora de mudar isso. Vamos dar a eles habilidades, ações, comportamentos!
Em JavaScript, quando o valor de uma propriedade é uma função, nós a chamamos de método. Métodos são as ações que um objeto pode executar.
Quem sou eu nesse objeto?
Para um método ser realmente útil, ele precisa interagir com as outras propriedades do seu próprio objeto. Mas como ele sabe a qual objeto pertence? A resposta é a palavra-chave
this
.Essa palavra-chave é uma das ideias mais poderosas e, às vezes, confusas do JavaScript. Mas vamos simplificar: dentro de um método de um objeto,
this
é um atalho que aponta para o próprio objeto que chamou o método. É uma referência de contexto.Vamos dar uma habilidade para a nossa dev Fernanda: a capacidade de subir de nível.
let devFernanda = { nome: "Fernanda", level: 25, xp: 450, xpParaProximoNivel: 500, ganharXp: function(pontos) { this.xp += pontos; console.log(`${this.nome} ganhou ${pontos} de XP! XP atual: ${this.xp}`); this.verificarSeSubiuDeNivel(); }, verificarSeSubiuDeNivel: function() { if (this.xp >= this.xpParaProximoNivel) { this.level++; this.xp = this.xp - this.xpParaProximoNivel; this.xpParaProximoNivel *= 1.5; // Aumenta a dificuldade para o próximo nível console.log(`BOOM! 🚀 ${this.nome} subiu para o nível ${this.level}!`); } } }; devFernanda.ganharXp(100); // Saída: "Fernanda ganhou 100 de XP! XP atual: 550" // Saída: "BOOM! 🚀 Fernanda subiu para o nível 26!" console.log(devFernanda.level); // Saída: 26 console.log(devFernanda.xp); // Saída: 50
Veja como
this.xp
, this.level
e this.nome
permitem que os métodos ganharXp
e verificarSeSubiuDeNivel
leiam e modifiquem as propriedades do objeto devFernanda
. O this
é a ponte que conecta a ação (o método) aos dados (as propriedades).Esse princípio de agrupar dados e os métodos que os manipulam em uma única unidade é um conceito chamado encapsulamento. É uma prática que torna nosso código mais seguro, organizado e fácil de entender, pois garante que os dados do objeto só sejam alterados de maneiras controladas e previsíveis.
Ferramentas de inspeção do Object
Beleza, nossos objetos estão cada vez mais complexos e cheios de vida. Mas surge uma nova necessidade: como podemos "olhar para dentro" de um objeto e listar tudo o que ele tem? Como podemos percorrer todas as suas propriedades?
Diferente de um array, um objeto não tem um método
.forEach()
embutido. Mas não se preocupe, o JavaScript moderno nos dá um arsenal de ferramentas para isso, através de métodos estáticos do construtor Object
.As três ferramentas que você mais vai usar são:
Object.keys(obj)
: Retorna um array com todas as chaves (nomes das propriedades) do objeto.
Object.values(obj)
: Retorna um array com todos os valores das propriedades.
Object.entries(obj)
: O mais poderoso! Retorna um array de arrays, onde cada subarray é um par[chave, valor]
.
Vamos usar essas ferramentas para inspecionar nosso
devProfile
:const devProfile = { nome: "Diego Fernandes", apelido: "Diegão", level: 28, techs: ["JavaScript", "React"] }; // Pegando só as chaves const chaves = Object.keys(devProfile); console.log(chaves); // Saída: ["nome", "apelido", "level", "techs"] // Pegando só os valores const valores = Object.values(devProfile); console.log(valores); // Saída: ["Diego Fernandes", "Diegão", 28, ["JavaScript", "React"]] // Pegando os pares [chave, valor] const entradas = Object.entries(devProfile); console.log(entradas); // Saída: [ // ["nome", "Diego Fernandes"], // ["apelido", "Diegão"], // ["level", 28], // ["techs", ["JavaScript", "React"]] // ]
A grande vantagem é que, uma vez que você tem um array, pode usar todos os métodos de array que já conhece, como o
forEach
, para iterar sobre as propriedades do objeto de forma segura e previsível.// Usando Object.entries para listar tudo de forma bonita Object.entries(devProfile).forEach(([chave, valor]) => { console.log(`${chave}: ${valor}`); });
Essa abordagem é considerada mais moderna e segura do que o laço
for...in
, que é mais antigo e pode, em algumas situações, trazer propriedades inesperadas da cadeia de protótipos do objeto. Se você curte iterar sobre dados, nosso artigo sobre loops vai te interessar!Pronto para acelerar e conquistar sua primeira vaga?
Você dominou os objetos, agora imagine aplicar esse conhecimento em projetos que vão para o seu portfólio, com o acompanhamento de tutores experientes e suporte personalizado para tirar todas as suas dúvidas. A Formação Full-Stack da Rocketseat te leva do zero às principais linguagens web, te prepara para o mercado e te conecta com empresas parceiras. É a sua chance de transformar conhecimento em carreira.
Se você sentiu que precisa fortalecer os fundamentos antes de acelerar, o Discover é o seu ponto de partida. Neste curso gratuito, você será introduzido ao mundo da tecnologia, aprendendo os blocos de construção da web como HTML, CSS e, claro, aprofundando seu JavaScript. É a jornada perfeita para adquirir as habilidades cruciais e desenvolver uma mentalidade de aprendizado contínuo.
Sua jornada apenas começou!
Uau! Se você chegou até aqui, pode comemorar! Você não apenas leu um artigo, você desvendou uma das estruturas mais poderosas e centrais do JavaScript.
Hoje, você transformou teoria em prática. Você aprendeu que:
- Objetos são pacotes inteligentes que organizam dados (propriedades) e ações (métodos).
- A diferença entre valor e referência é crucial e agora você sabe como evitar bugs comuns.
- Você pode criar objetos com literais
{}
para casos únicos e usar funções construtoras como moldes para criar múltiplos objetos.
- O
this
não é um bicho de sete cabeças, mas sim a chave de contexto que dá poder aos seus métodos.
- Existem ferramentas modernas como
Object.keys
,values
eentries
para inspecionar seus objetos como um profissional.
Este conhecimento é um passo gigante na sua evolução como dev. A programação é uma jornada de aprendizado contínuo, e você acabou de desbloquear uma fase muito importante.
E aí, qual foi o maior "clique" que você teve sobre objetos lendo este material? Conta pra gente lá na nossa comunidade!
Artigos_
Explore conteúdos relacionados
Descubra mais artigos que complementam seu aprendizado e expandem seu conhecimento.