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:

  1. Procura exibirResumo em p1
  2. Não achou? Procura em Produto.prototype
  3. Achou? Executa com this apontando para p1

prototype x __proto__ (visão prática)

  • Produto.prototype: objeto usado como base para instâncias criadas com new Produto()
  • p1.__proto__: referência interna do objeto p1 para 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 prototype nã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.