La herencia y los prototipos son conceptos fundamentales en JavaScript para la programación orientada a objetos. Vamos a explorar cómo funcionan y cómo se implementa la herencia a través de prototipos en JavaScript.
Prototipos
En JavaScript, cada objeto tiene un enlace interno a otro objeto llamado "prototipo" (`__proto__`). Cuando intentas acceder a una propiedad en un objeto, si no se encuentra en el objeto actual, JavaScript buscará en su prototipo y continuará la búsqueda en la cadena de prototipos hasta encontrar la propiedad o alcanzar `null`.
const objeto1 = { propiedad: 10 };
const objeto2 = Object.create(objeto1); // objeto2 tiene a objeto1 como prototipo
console.log(objeto2.propiedad); // Acceso a la propiedad desde el prototipo
Funciones Constructoras
Las funciones constructoras son funciones que se utilizan para inicializar objetos con un conjunto específico de propiedades y métodos. Se utilizan en conjunto con `new`.
function Persona(nombre, edad) {
this.nombre = nombre;
this.edad = edad;
}
Persona.prototype.saludar = function() {
console.log(`Hola, soy ${this.nombre} y tengo ${this.edad} años.`);
};
const persona1 = new Persona('Juan', 30);
persona1.saludar(); // Imprime: Hola, soy Juan y tengo 30 años.
Herencia con Prototipos
Para lograr herencia en JavaScript, establecemos la relación de herencia entre los prototipos de los objetos.
function Estudiante(nombre, edad, curso) {
Persona.call(this, nombre, edad); // Llamada al constructor de Persona
this.curso = curso;
}
Estudiante.prototype = Object.create(Persona.prototype); // Estableciendo la herencia
Estudiante.prototype.constructor = Estudiante; // Corrigiendo la propiedad constructor
Estudiante.prototype.presentarse = function() {
console.log(`Soy ${this.nombre}, tengo ${this.edad} años y estudio ${this.curso}.`);
};
const estudiante1 = new Estudiante('Luisa', 25, 'Matemáticas');
estudiante1.saludar(); // Heredado de Persona
estudiante1.presentarse(); // Método propio de Estudiante
En este ejemplo, `Estudiante` hereda de `Persona` mediante la asignación de `Persona.prototype` al prototipo de `Estudiante`. Así, `Estudiante` tiene acceso a los métodos definidos en `Persona`.
Clases (ES6+)
A partir de ECMAScript 2015 (ES6), JavaScript introdujo la sintaxis de clases que facilita la implementación de herencia.
class Animal {
constructor(nombre) {
this.nombre = nombre;
}
hablar() {
console.log(`${this.nombre} hace un sonido.`);
}
}
class Perro extends Animal {
hablar() {
console.log(`${this.nombre} ladra.`);
}
}
const miPerro = new Perro('Fido');
miPerro.hablar(); // Imprime: Fido ladra.
Estos son los conceptos básicos de prototipos y herencia en JavaScript. La herencia basada en prototipos es un aspecto fundamental de la programación en JavaScript y es esencial para entender cómo se estructuran y comparten comportamientos los objetos. ¡Sigue practicando y experimentando para mejorar tus habilidades en JavaScript!