Sobes.tech
Middle

¿Qué son los prototipos en JavaScript?

sobes.tech AI

Respuesta de la IA

En JavaScript, los objetos pueden heredar propiedades y métodos de otros objetos a través del mecanismo de prototipos. Cada objeto en JavaScript tiene una propiedad interna oculta [[Prototype]], que apunta a otro objeto que es su prototipo. Cuando se accede a una propiedad o método de un objeto, el motor de JavaScript primero lo busca en el propio objeto. Si no lo encuentra, accede a la propiedad [[Prototype]] y busca en el prototipo. Este proceso se repite a lo largo de la cadena de prototipos hasta que la propiedad se encuentre o hasta que se alcance null (el final de la cadena).

Conceptos principales:

  • Cadena de prototipos: Secuencia de objetos vinculados a través de la propiedad [[Prototype]].
  • Herencia: Los objetos heredan propiedades y métodos de sus prototipos.
  • __proto__: Propiedad utilizada históricamente (aunque no estandarizada inicialmente) para acceder a [[Prototype]]. Actualmente, se prefiere usar Object.getPrototypeOf().
  • prototype: Propiedad del constructor a la que [[Prototype]] hace referencia en los instancias creadas con ese constructor.

Ejemplo con constructor y prototipo:

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

// Añadir método al prototipo
Person.prototype.sayHello = function() {
  console.log("Hola, mi nombre es " + this.name);
};

// Crear una instancia
const person1 = new Person("Alice", 30);

// Llamar al método del prototipo
person1.sayHello(); // Salida: Hola, mi nombre es Alice

// Acceder al prototipo de la instancia
console.log(Object.getPrototypeOf(person1) === Person.prototype); // Salida: true

En este ejemplo:

  • Person es una función constructora.
  • Person.prototype es el objeto que actúa como prototipo para todas las instancias creadas con new Person().
  • sayHello es un método añadido al prototipo. Todas las instancias de Person heredan este método.
  • Cuando se llama person1.sayHello(), el motor de JavaScript busca sayHello en person1. Si no lo encuentra, accede a [[Prototype]] de person1 (que es igual a Person.prototype) y encuentra el método allí.

Los prototipos permiten un uso eficiente de la memoria, ya que los métodos y propiedades comunes se almacenan en el prototipo, en lugar de duplicarse en cada instancia del objeto.