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:
No próprio objeto;
No seu protótipo;
No protótipo do protótipo;
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
diretamentePrecisa 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
prototype
de funçõesCada 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.prototype
→true
Isso forma a corrente de protótipos! 🔗
🏗️ Vantagens e Desvantagens das Abordagens
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 ficamO operador
new
usaprototype
para herdarPodemos acessar ou alterar protótipos com
getPrototypeOf
esetPrototypeOf
A corrente de protótipos termina quando chega em
null
Herança em JS é poderosa, mas deve ser usada com clareza 🧠
Last updated