Protótipo

Em JavaScript, todos os objetos são instâncias de um protótipo. Cada objeto em JavaScript tem um protótipo associado, que é basicamente um objeto de onde ele herda propriedades e métodos. O sistema de protótipos é uma característica fundamental em JavaScript que permite a herança e a extensão de objetos.

Protótipo Padrão e Herança:

Cada objeto em JavaScript possui um protótipo (exceto o objeto de protótipo, que é a raiz de todos os protótipos em JavaScript). Quando você tenta acessar uma propriedade ou um método de um objeto que não está definido no próprio objeto, o JavaScript procura essa propriedade ou método no protótipo desse objeto. Se não encontrar, ele procura no protótipo do protótipo, e assim por diante, subindo na cadeia de protótipos até encontrar ou não encontrar a propriedade ou método desejado.

Usando Protótipos para Adicionar Métodos:

Você pode adicionar métodos a todos os objetos de um determinado tipo usando o seu protótipo. Por exemplo, você pode adicionar um método mostrar a todos os objetos do tipo Carro desta forma:

function Carro(marca, modelo) {
    this.marca = marca;
    this.modelo = modelo;
}

// Adicionando um método ao protótipo do objeto Carro
Carro.prototype.mostrar = function() {
    console.log(this.marca + " " + this.modelo);
};

var meuCarro = new Carro("Toyota", "Corolla");
meuCarro.mostrar(); // Saída: "Toyota Corolla"

Neste exemplo, mostrar é adicionado ao protótipo do objeto Carro, permitindo que todos os objetos criados a partir do construtor Carro acessem este método.

Usando Protótipos para Adicionar Propriedades:

Você também pode adicionar propriedades aos objetos usando protótipos. No entanto, geralmente, é preferível adicionar métodos ao protótipo em vez de propriedades, pois as propriedades adicionadas aos protótipos podem levar a comportamentos inesperados devido à natureza compartilhada dos protótipos.

function Pessoa(nome) {
    this.nome = nome;
}

// Adicionando uma propriedade ao protótipo do objeto Pessoa
Pessoa.prototype.pais = "Brasil";

var pessoa1 = new Pessoa("Alice");
var pessoa2 = new Pessoa("Bob");

console.log(pessoa1.pais); // Saída: "Brasil"
console.log(pessoa2.pais); // Saída: "Brasil"

Neste exemplo, pais é adicionado ao protótipo do objeto Pessoa, então todas as instâncias de Pessoa compartilharão essa propriedade.

A compreensão do sistema de protótipos é fundamental para entender a herança e a estrutura de objetos em JavaScript. É uma das características mais poderosas e distintivas da linguagem.