Protótipos: compartilhando funcionalidades entre objetos
Descubra como o JavaScript permite que objetos herdem métodos e propriedades de outros objetos de forma eficiente.
Até aqui, você viu que podemos criar vários objetos com funções construtoras.
Agora vem uma melhoria importante: evitar repetir métodos em cada objeto.
Pense assim:
- sem protótipo: cada objeto leva sua própria “caixa de ferramentas”
- com protótipo: vários objetos compartilham a mesma caixa de ferramentas
Isso economiza memória e deixa o código mais eficiente.
O que é protótipo no JavaScript?
Todo objeto em JavaScript pode ter um “objeto pai de referência”, chamado protótipo.
Quando você tenta acessar algo no objeto e ele não encontra, o JavaScript procura no protótipo.
Esse caminho é chamado de cadeia de protótipos (prototype chain).
Problema comum sem protótipo
function Produto(nome, preco) {
this.nome = nome;
this.preco = preco;
this.exibirResumo = function () {
return `${this.nome} - R$ ${this.preco}`;
};
}
Aqui, exibirResumo é recriado para cada novo produto.
Se você criar 1000 produtos, terá 1000 cópias do mesmo método.
Solução com protótipo
function Produto(nome, preco) {
this.nome = nome;
this.preco = preco;
}
Produto.prototype.exibirResumo = function () {
return `${this.nome} - R$ ${this.preco}`;
};
const p1 = new Produto("Teclado", 200);
const p2 = new Produto("Mouse", 90);
console.log(p1.exibirResumo());
console.log(p2.exibirResumo());
Agora os dois objetos usam o mesmo método compartilhado no Produto.prototype.
Como o JavaScript encontra um método?
Quando você chama:
p1.exibirResumo()
o motor faz, simplificando:
- Procura
exibirResumoemp1 - Não achou? Procura em
Produto.prototype - Achou? Executa com
thisapontando parap1
prototype x __proto__ (visão prática)
Produto.prototype: objeto usado como base para instâncias criadas comnew Produto()p1.__proto__: referência interna do objetop1para seu protótipo
Em prática de aprendizado, foque mais em prototype para definir métodos compartilhados.
Exemplo com mais de um método compartilhado
function Conta(titular, saldoInicial) {
this.titular = titular;
this.saldo = saldoInicial;
}
Conta.prototype.depositar = function (valor) {
this.saldo += valor;
};
Conta.prototype.sacar = function (valor) {
if (valor > this.saldo) return "Saldo insuficiente";
this.saldo -= valor;
return "Saque realizado";
};
Conta.prototype.verSaldo = function () {
return `Saldo de ${this.titular}: R$ ${this.saldo}`;
};
Todos os objetos Conta vão compartilhar esses métodos.
Vantagens dos protótipos
- menos repetição de métodos
- melhor uso de memória
- código mais organizado
- base para entender herança em JavaScript
- ajuda a compreender o que as classes fazem “por baixo dos panos”
Resumo da lição
- Protótipos permitem compartilhar métodos entre objetos.
- Métodos no
prototypenão são duplicados em cada instância. - O JavaScript usa a cadeia de protótipos para buscar propriedades e métodos.
- Entender protótipos facilita muito o estudo de classes e herança.