7.1 Fundamentos de la Herencia
La herencia de clases en JavaScript permite crear nuevas clases basadas en clases ya existentes, reutilizando y ampliando su funcionalidad. Este es un aspecto clave de la programación orientada a objetos (ООП), que permite crear jerarquías de clases y gestionar el comportamiento de los objetos.
Para la herencia de clases se usa la palabra clave extends
. La clase que hereda otra clase se llama
clase derivada (subclass), y la clase de la que se hereda se llama clase base (superclass).
Ejemplo:
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name} makes a noise.`);
}
}
class Dog extends Animal {
speak() {
console.log(`${this.name} barks.`);
}
}
const dog = new Dog('Rex');
dog.speak(); // "Rex barks."
Explicación:
- La clase
Animal
es una clase base con un constructor y un métodospeak()
- La clase
Dog
hereda deAnimal
y redefine el métodospeak()
- La instancia
dog
de la claseDog
usa el método redefinidospeak()
7.2 La palabra clave super
La palabra clave super
se usa para llamar al constructor o métodos de la clase base desde la clase derivada.
1. Llamada al constructor de la clase base
La clase derivada debe llamar al constructor de la clase base usando super()
antes de usar this
.
Ejemplo:
El constructor de Dog
llama a super(name)
para inicializar la propiedad name de la clase base Animal
.
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name} makes a noise.`);
}
}
class Dog extends Animal {
constructor(name, breed) {
super(name);
this.breed = breed;
}
speak() {
console.log(`${this.name} barks.`);
}
}
const dog = new Dog('Rex', 'Labrador');
console.log(dog.name); // "Rex"
console.log(dog.breed); // "Labrador"
dog.speak(); // "Rex barks."
2. Llamada a métodos de la clase base
Los métodos de la clase base pueden ser llamados desde la clase derivada usando super
.
Ejemplo:
El método speak()
de la clase Dog
llama al método speak()
de la clase base Animal
usando super.speak()
y luego ejecuta su propia lógica.
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name} makes a noise.`);
}
}
class Dog extends Animal {
speak() {
super.speak(); // Llamada al método de la clase base
console.log(`${this.name} barks.`);
}
}
const dog = new Dog('Rex');
dog.speak();
// "Rex makes a noise."
// "Rex barks."
7.3 Herencia y redefinición de métodos
La herencia permite que las clases derivadas redefinan los métodos de la clase base. Esto permite cambiar o ampliar la funcionalidad de los métodos.
Ejemplo:
El método speak()
de la clase Dog
redefine el método speak()
de la clase base
Animal
, proporcionando su propia implementación.
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name} makes a noise.`);
}
}
class Dog extends Animal {
speak() {
console.log(`${this.name} barks.`);
}
}
const animal = new Animal('Generic Animal');
animal.speak(); // "Generic Animal makes a noise."
const dog = new Dog('Rex');
dog.speak(); // "Rex barks."
7.4 Herencia y métodos adicionales
La clase derivada puede añadir nuevos métodos que no existan en la clase base.
Ejemplo:
La clase Dog
añade un nuevo método fetch()
, que no existe en la clase base Animal
.
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name} makes a noise.`);
}
}
class Dog extends Animal {
speak() {
console.log(`${this.name} barks.`);
}
fetch() {
console.log(`${this.name} is fetching.`);
}
}
const dog = new Dog('Rex');
dog.speak(); // "Rex barks."
dog.fetch(); // "Rex is fetching."
7.5 Comprobación de la herencia
Para comprobar la herencia se puede usar el operador instanceof
y el método isPrototypeOf()
.
Ejemplo:
El operador instanceof
comprueba si un objeto es una instancia de una clase. El método isPrototypeOf()
comprueba si el prototipo del objeto es parte de la cadena de prototipos de otro objeto.
console.log(dog instanceof Dog); // true
console.log(dog instanceof Animal); // true
console.log(Animal.prototype.isPrototypeOf(Dog.prototype)); // true
GO TO FULL VERSION