Prototype
O Prototype é um padrão criacional que permite criar novos objetos a partir da cópia de um objeto existente.
Em vez de criar um objeto completamente do zero:
const user = new User();
podemos clonar um objeto já configurado:
const copy = user.clone();
A ideia é:
Utilizar um objeto existente como modelo para criar novos objetos.
Exemplo simples
Imagine um documento:
class Document {
constructor(
public title: string,
public content: string
) {}
clone() {
return new Document(
this.title,
this.content
);
}
}
Podemos criar um documento:
const original =
new Document(
"Meu Documento",
"Conteúdo inicial"
);
Agora podemos cloná-lo:
const copy =
original.clone();
Temos:
Original
│
│ clone()
↓
Cópia
Os objetos são diferentes:
console.log(
original === copy
);
// false
Mas possuem os mesmos valores:
console.log(
original.title === copy.title
);
// true
Alterando a cópia
Podemos modificar a cópia:
copy.title =
"Documento Copiado";
O original permanece:
console.log(
original.title
);
// Meu Documento
Enquanto a cópia possui:
console.log(
copy.title
);
// Documento Copiado
Exemplo prático: jogos
O Prototype pode ser útil em jogos.
Imagine um inimigo:
class Enemy {
constructor(
public health: number,
public damage: number,
public speed: number
) {}
clone() {
return new Enemy(
this.health,
this.damage,
this.speed
);
}
}
Criamos um inimigo base:
const enemyPrototype =
new Enemy(
100,
20,
5
);
Agora podemos criar vários inimigos:
const enemy1 =
enemyPrototype.clone();
const enemy2 =
enemyPrototype.clone();
const enemy3 =
enemyPrototype.clone();
Podemos então alterar cada um:
enemy1.health = 200;
enemy2.damage = 50;
enemy3.speed = 10;
Isso evita repetir toda a configuração inicial.
Shallow Copy vs Deep Copy
É importante ter cuidado ao clonar objetos.
Imagine:
class User {
constructor(
public name: string,
public settings: {
theme: string;
}
) {}
clone() {
return {
...this
};
}
}
O objeto externo foi copiado, mas settings ainda pode ser compartilhado.
Para estruturas complexas, pode ser necessário realizar um Deep Copy.
Por exemplo:
clone() {
return structuredClone(this);
}
A estratégia depende da estrutura do objeto.
Quando usar?
Prototype é útil quando:
- Criar o objeto do zero é caro.
- Os objetos possuem configurações complexas.
- Temos objetos base que serão reutilizados.
- Precisamos criar muitas variações de um mesmo objeto.
Exemplos:
Jogos
Documentos
Templates
Objetos gráficos
Configurações
Objetos complexos
Resumo
O fluxo é:
Objeto Prototype
│
│ clone()
├─────────────┐
↓ ↓
Objeto A Objeto B
A ideia principal é:
Criar novos objetos clonando objetos existentes em vez de construí-los do zero.