JavaScript: Classes e Módulos em JavaScript
Última atualização: 2026-10-13
Conforme os projetos crescem, você precisa de mais do que funções e variáveis espalhadas — precisa de estrutura organizada de código. Classes fornecem padrões orientados a objetos, e Módulos fornecem isolamento de código no nível de arquivo. Juntos, formam a base de projetos JS modernos.
1. Sintaxe de Classe
Uma Classe é um modelo para criar objetos — açúcar sintático sobre funções construtoras.
<script>
class NomeClasse {
constructor(params) {
this.propriedade = params;
}
metodo() {
// ...
}
}
</script>
<div id="output" style="padding: 10px; border: 1px solid #ccc;"></div>
<script>
const output = document.getElementById('output');
class Aluno {
constructor(nome, idade, serie) {
this.nome = nome;
this.idade = idade;
this.serie = serie;
}
apresentar() {
return 'Meu nome é ' + this.nome + ', tenho ' + this.idade + ' anos, estou no ' + this.serie + '.';
}
estudar(materia) {
return this.nome + ' está estudando ' + materia + '.';
}
}
const a1 = new Aluno('Alice', 12, '6º ano');
const a2 = new Aluno('Bob', 11, '5º ano');
output.textContent = a1.apresentar() + '\n' + a2.apresentar() + '\n' + a1.estudar('Matemática');
</script>
class é essencialmente açúcar sintático sobre funções construtoras + protótipos. new Aluno() funciona igual ao antigo new function Aluno(), mas a sintaxe é mais limpa e intuitiva.
2. Propriedades e Métodos
(1) Propriedades e Métodos de Instância
Propriedades e métodos definidos com this.xxx dentro do constructor pertencem à instância — cada objeto recebe sua própria cópia.
(2) Métodos Estáticos
Métodos definidos com a palavra-chave static pertencem à classe em si, não às instâncias. Chame-os via NomeClasse.metodo().
(3) Getters e Setters
Use as palavras-chave get e set para definir "propriedades virtuais" — funções que executam automaticamente na leitura/escrita.
<div id="output" style="white-space: pre; font-family: monospace; padding: 10px; border: 1px solid #ccc;"></div>
<script>
const output = document.getElementById('output');
class Pessoa {
constructor(primeiroNome, sobrenome) {
this.primeiroNome = primeiroNome;
this.sobrenome = sobrenome;
}
get nomeCompleto() {
return this.primeiroNome + ' ' + this.sobrenome;
}
set nomeCompleto(valor) {
const partes = valor.split(' ');
this.primeiroNome = partes[0];
this.sobrenome = partes[1];
}
}
const p = new Pessoa('João', 'Silva');
output.textContent = 'nomeCompleto: ' + p.nomeCompleto + '\n';
p.nomeCompleto = 'Maria Santos';
output.textContent += 'Após alteração: ' + p.nomeCompleto;
</script>
▶ Exemplo: Métodos Estáticos e Getters/Setters
▶ Experimente3. Herança
extends permite que uma classe filha herde propriedades e métodos de uma classe pai. super chama o construtor ou métodos do pai.
▶ Exemplo: Demonstração de Herança
▶ Experimenteconstructor de uma classe filha, você deve chamar super() antes de usar this — porque até o pai ser inicializado, o this do filho não existe. Esta é a regra mais fácil de esquecer ao aprender herança.
4. Módulos ES
Módulos são a unidade de organização de código do JS. Um módulo = um arquivo. Variáveis dentro de um módulo são privadas por padrão — apenas itens explicitamente exportados são acessíveis externamente.
(1) Exportações/Importações Nomeadas
<script>
// math.js
export const PI = 3.14;
export function somar(a, b) { return a + b; }
// app.js
import { PI, somar } from './math.js';
</script>
(2) Exportações/Importações Padrão
<script>
// logger.js
export default function log(msg) { console.log(msg); }
// app.js
import log from './logger.js';
</script>
(3) Usando Módulos em HTML
Simplesmente adicione type="module" à tag script.
<script type="module">
import { somar } from './math.js';
console.log(somar(1, 2));
</script>
▶ Exemplo: Simulação de Módulo em Arquivo Único (Módulo Inline)
Em projetos reais, módulos devem ser divididos em arquivos separados. Aqui simulamos dentro de um único arquivo HTML usando type="module".
❓ Perguntas Frequentes
new (não podem rodar como funções comuns), métodos são não enumeráveis, e o modo estrito é ativado por padrão. A sintaxe é mais limpa, então Classes são recomendadas.import e require?import é sintaxe de módulo ES — analisada estaticamente em tempo de compilação. require é CommonJS (Node.js) — carregada dinamicamente em tempo de execução. Navegadores suportam nativamente apenas módulos ES. import deve estar no nível superior; require pode estar em qualquer lugar.export default App; export const utils = {};. Importe com: import App, { utils } from './modulo.js'.📖 Resumo
classé açúcar sintático sobre construtores;constructoré o inicializador, e métodos são definidos no protótipo- Métodos
staticpertencem à classe, não às instâncias — ideais para métodos utilitários e de fábrica get/setdefinem propriedades virtuais que interceptam leituras/escritas para validação ou computaçãoextendshabilita herança; oconstructorfilho deve chamarsuper()primeiro- Módulos ES usam
export/importpara isolamento e reuso de código;type="module"os habilita em HTML - Módulos organizam código por funcionalidade, permitem carregamento preguiçoso e evitam poluição do namespace global
📝 Exercícios
- Básico: Crie uma classe
Retangulocom propriedadeslarguraealtura, além dos métodosobterArea()eobterPerimetro(). - Intermediário: Adicione um getter
get area()e setterset area(valor)aoRetangulo(definir área ajusta largura/altura proporcionalmente). Depois crie uma subclasseQuadradoque estendaRetangulo. - Desafio: Projete uma classe
GerenciadorEventoscom métodoson(evento, callback),off(evento, callback)eemit(evento, dados)para simular um sistema simples de eventos (dica: use um objeto mapeando eventos para arrays de callbacks).