Page cover

7.8.5 - Classes e Objetos

🧬 Nível 2: Herança e Corrente de Protótipos em JavaScript

🧬 Nível 2: Herança e Corrente de Protótipos em JavaScript

Quando você ouve "herança", talvez pense em pais e filhos — e é bem por aí mesmo! 🧒👨‍🦳 Em JavaScript, objetos herdam propriedades e métodos uns dos outros por meio de algo chamado corrente de protótipos (ou prototype chain).


🔗 O que é uma Corrente de Protótipos?

Sempre que você tenta acessar uma propriedade ou método em um objeto, o JavaScript procura:

  1. No próprio objeto;

  2. No seu protótipo;

  3. No protótipo do protótipo;

  4. E assim por diante, até chegar em null.

📦 É como subir degrau por degrau até encontrar o que você pediu (ou cair da escada 😅).


🧱 Criando e Mutando Correntes de Protótipos

Existem várias formas de criar ou mudar a corrente de protótipos. Vamos ver as principais:


Object.create()

A forma mais recomendada!

const animal = {
  tipo: "Animal",
  andar() {
    console.log("Andando...");
  }
};

const cachorro = Object.create(animal);
cachorro.latir = () => console.log("Au au!");

cachorro.andar(); // Andando... (herdado)

Prós:

  • Clareza e controle

  • Mantém herança limpa

  • Não interfere em objetos existentes

🚫 Contras:

  • Sem suporte a constructor diretamente

  • Precisa criar propriedades depois


🛠️ Object.setPrototypeOf(obj, prototipo)

Define um novo protótipo depois que o objeto já foi criado.

const pessoa = {};
const humano = { especie: "Humano" };

Object.setPrototypeOf(pessoa, humano);

console.log(pessoa.especie); // Humano

✅ Útil para alterar a herança de um objeto existente 🚫 Desvantagens:

  • ⚠️ Mais lento em performance

  • Pode confundir a leitura do código


🔍 Object.getPrototypeOf(obj)

Serve para ver quem é o protótipo de um objeto:

const prot = Object.getPrototypeOf(cachorro);
console.log(prot === animal); // true

🧠 Propriedades de Funções? Como assim?

Em JavaScript, funções são objetos também! Isso significa que você pode fazer coisas como:

function Professor() {}
Professor.sala = "305B";

console.log(Professor.sala); // 305B

📌 prototype de funções

Cada função em JS recebe, por padrão, uma propriedade chamada prototype. Ela é usada quando você cria objetos com new.

function Pessoa(nome) {
  this.nome = nome;
}
Pessoa.prototype.falar = function () {
  console.log(`Olá, eu sou ${this.nome}`);
};

const maria = new Pessoa("Maria");
maria.falar(); // Olá, eu sou Maria

🧪 maria.__proto__ === Pessoa.prototypetrue Isso forma a corrente de protótipos! 🔗


🏗️ Vantagens e Desvantagens das Abordagens

Método
Vantagens
Desvantagens

Object.create()

Claro, limpo, controlado

Sem constructor, mais verboso

setPrototypeOf()

Altera objetos já existentes

⚠️ Performance ruim

class e extends

Sintaxe moderna e clara

Abstrai o comportamento real

new com prototype

Controla comportamento e memória

Mais código, mas altamente eficiente


⚙️ Performance da Corrente de Protótipos

🔍 Quanto mais longa a cadeia, mais demorada será a busca por métodos/propriedades.

Por isso, evite criar correntes muito profundas! Se possível, mantenha sua hierarquia simples. Se precisar otimizar, defina propriedades no próprio objeto quando usadas com frequência.


📦 Recapitulando

  • prototype é onde métodos compartilhados ficam

  • O operador new usa prototype para herdar

  • Podemos acessar ou alterar protótipos com getPrototypeOf e setPrototypeOf

  • A corrente de protótipos termina quando chega em null

  • Herança em JS é poderosa, mas deve ser usada com clareza 🧠

Last updated