Sobes.tech
Middle

O que são protótipos em JavaScript?

sobes.tech IA

Resposta da IA

Em JavaScript, os objetos podem herdar propriedades e métodos de outros objetos através do mecanismo de protótipos. Cada objeto em JavaScript possui uma propriedade interna oculta [[Prototype]], que aponta para outro objeto, seu protótipo. Quando se acede a uma propriedade ou método de um objeto, o motor JavaScript primeiro procura no próprio objeto. Se não encontrar, acede à propriedade [[Prototype]] e procura no protótipo. Este processo repete-se ao longo da cadeia de protótipos até que a propriedade seja encontrada ou até que null seja atingido (fim da cadeia).

Conceitos principais:

  • Cadeia de protótipos: Sequência de objetos ligados através da propriedade [[Prototype]].
  • Herança: Os objetos herdam propriedades e métodos dos seus protótipos.
  • __proto__: Propriedade historicamente usada (embora não padronizada inicialmente) para aceder a [[Prototype]]. Atualmente, é preferível usar Object.getPrototypeOf().
  • prototype: Propriedade do construtor à qual [[Prototype]] faz referência nas instâncias criadas com esse construtor.

Exemplo com construtor e protótipo:

// Construtor
function Person(name, age) {
  this.name = name;
  this.age = age;
}

// Adicionar método ao protótipo
Person.prototype.sayHello = function() {
  console.log("Olá, o meu nome é " + this.name);
};

// Criar uma instância
const person1 = new Person("Alice", 30);

// Chamar método do protótipo
person1.sayHello(); // Saída: Olá, o meu nome é Alice

// Aceder ao protótipo da instância
console.log(Object.getPrototypeOf(person1) === Person.prototype); // Saída: true

Neste exemplo:

  • Person é uma função construtora.
  • Person.prototype é o objeto que serve de protótipo para todas as instâncias criadas com new Person().
  • sayHello é um método adicionado ao protótipo. Todas as instâncias de Person herdam este método.
  • Quando se chama person1.sayHello(), o motor JavaScript procura sayHello em person1. Se não encontrar, consulta o [[Prototype]] de person1 (que é igual a Person.prototype) e encontra o método lá.

Os protótipos permitem uma utilização eficiente de memória, pois os métodos e propriedades comuns ficam armazenados no protótipo, em vez de serem duplicados em cada instância de objeto.