Herencia en la práctica

Clase 76 de 80Curso de JavaScript Desde Cero

Contenido del curso

Primeros Pasos

Funciones y This

Resumen

Comprender cómo JavaScript gestiona internamente las clases y sus relaciones es fundamental para escribir código limpio y reutilizable. La propiedad prototipo y el mecanismo de herencia son dos pilares que permiten compartir métodos y propiedades entre objetos sin duplicar código, y dominarlos marca la diferencia entre un desarrollador principiante y uno con bases sólidas en programación orientada a objetos.

¿Qué es la propiedad prototipo y por qué solo existe en funciones y clases?

La propiedad prototipo es algo que JavaScript genera de forma automática cuando creamos una clase constructora o una función constructora [0:06]. No es algo que programemos manualmente; simplemente aparece. Su función es almacenar todos los métodos y propiedades que definimos dentro de esa clase o función.

  • Solo existe en clases y funciones constructoras, nunca en instancias [1:00].
  • Permite que las instancias u otras clases que extiendan de ella accedan a esos métodos y propiedades compartidos.
  • Funciona como un contenedor interno que asegura la reutilización de código.

Cuando generamos una instancia con new, esa instancia no posee la propiedad prototipo por sí misma, pero sí puede acceder a los métodos y propiedades a través de la cadena de prototipos de su clase constructora.

¿Cómo se construye una clase base y se extiende con herencia?

Para ilustrar el concepto, se construye una clase llamada Animal con un constructor que recibe nombre y tipo, y un método emitirSonido [1:25]:

javascript class Animal { constructor(nombre, tipo) { this.nombre = nombre; this.tipo = tipo; } emitirSonido() { console.log("El animal emite un sonido"); } }

Esta clase es un molde genérico. Si necesitamos algo más específico, como representar perros con su raza, creamos una nueva clase que extienda de Animal [3:05]:

javascript class Perro extends Animal { constructor(nombre, tipo, raza) { super(nombre, tipo); this.raza = raza; } emitirSonido() { console.log("El perro ladra"); } correr() { console.log(${this.nombre} corre alegremente); } }

¿Qué hace la palabra reservada extends?

Al escribir extends Animal, le indicamos a JavaScript que la clase Perro va a heredar todos los métodos y propiedades de Animal [3:20]. Esto significa que no necesitamos replicar nombre ni tipo dentro de Perro, porque ya existen en la clase padre.

¿Para qué sirve super dentro del constructor?

La palabra reservada super llama al constructor de la clase base [4:15]. Sin super(nombre, tipo), no podríamos usar this.nombre ni this.tipo dentro de Perro, porque esas propiedades pertenecen a Animal. Es el puente que conecta la clase hija con las propiedades de la clase padre.

  • Sin super, tendríamos que eliminar extends y duplicar código.
  • Con super, reutilizamos lo que ya existe y solo añadimos lo nuevo, como this.raza.

¿Qué significa reescribir un método heredado?

El método emitirSonido existe tanto en Animal como en Perro, pero con contenido diferente [5:45]. Cuando creamos una instancia de Perro y llamamos a ese método, JavaScript ejecuta la versión de Perro, no la de Animal. Esto se conoce como sobreescritura de métodos: la clase hija redefine el comportamiento heredado.

¿Cómo verificar los prototipos y la herencia en la práctica?

Al crear una instancia y explorar los prototipos, todo cobra sentido [6:30]:

javascript const perroUno = new Perro("Bobby", "perro", "pug"); console.log(perroUno); // { nombre: "Bobby", tipo: "perro", raza: "pug" } perroUno.correr(); // "Bobby corre alegremente" perroUno.emitirSonido(); // "El perro ladra"

Para inspeccionar la propiedad prototipo directamente en las clases constructoras [8:10]:

  • Animal.prototype muestra el método emitirSonido y el constructor Animal.
  • Perro.prototype muestra emitirSonido (sobreescrito), correr y además hereda el prototipo de Animal.

Esto confirma que la cadena de prototipos conecta Perro con Animal, permitiendo que las instancias accedan a propiedades y métodos de ambas clases sin duplicación.

El uso correcto de extends, super y la comprensión de los prototipos te permitirá construir estructuras de código escalables y organizadas. Si quieres profundizar, experimenta creando más clases hijas y observa cómo se comporta la cadena de prototipos en la consola.