Implementación de Herencia en JavaScript con Clases

Clase 16 de 20Curso Básico de Programación Orientada a Objetos con JavaScript

Resumen

¿Cómo implementar la herencia en JavaScript?

La herencia es un concepto clave en la programación orientada a objetos que permite que una clase derive de otra, compartiendo sus propiedades y métodos. En JavaScript, podemos implementar la herencia utilizando la palabra clave extends en combinación con super, permitiendo que subclases hereden características de clases madre.

¿Qué es la clase base y cómo se define?

En JavaScript, una clase base actúa como la estructura troncal a partir de la cual otras clases pueden derivar. Podemos crear una clase estudiante genérica que contenga atributos comunes a todos los estudiantes, sin importar el tipo de suscripción. Esto permite la reutilización del código.

class Student {
  constructor(name, email, approveCourses) {
    this.name = name;
    this.email = email;
    this.approveCourses = [];
  }

  // métodos comunes para todos los estudiantes
}

¿Cómo crear subclases y extender la clase madre?

Para que una subclase herede las propiedades de la clase madre, utilizamos la palabra clave extends seguida del nombre de la clase madre. Además, es necesario reinstanciar el constructor utilizando super, que permite llamar al constructor de la clase madre.

class FreeStudent extends Student {
  constructor(...props) {
    super(...props);
  }

  // métodos exclusivos para estudiantes gratuitos
}

class BasicStudent extends Student {
  constructor(...props) {
    super(...props);
  }

  // métodos exclusivos para estudiantes básicos
}

¿Cómo validar propiedades específicas en subclases?

Cada subclase puede tener métodos específicos con validaciones personalizadas. Por ejemplo, podemos crear un método approveCourse que verifique si un curso es gratuito antes de que un estudiante de tipo gratuito lo agregue a su lista de cursos aprobados.

approveCourse(newCourse) {
  if (newCourse.isFree) {
    this.approveCourses.push(newCourse);
  } else {
    console.warn(`Lo sentimos ${this.name}, solo puedes tomar cursos gratuitos.`);
  }
}

Para un estudiante de tipo básico, podemos controlar que no apruebe cursos en inglés:

approveCourse(newCourse) {
  if (newCourse.lang !== 'English') {
    this.approveCourses.push(newCourse);
  } else {
    console.warn(`Lo sentimos ${this.name}, no puedes tomar cursos en inglés.`);
  }
}

¿Cómo inicializar objetos específicos con sus respectivas subclases?

Para asignar estudiantes a una clase concreta, simplemente creamos instancias de las respectivas subclases. Por ejemplo:

const juan = new FreeStudent('Juan', 'juan@example.com');
const miguelito = new BasicStudent('Miguelito', 'miguelito@example.com');

En cada caso, podemos invocar métodos específicos dependiendo del tipo de estudiante.

¿Cómo añadir propiedades y probar su funcionalidad?

Implementar características adicionales como propiedades para los cursos aumenta la complejidad y flexibilidad del sistema. Agregar una propiedad opcional como isFree permite realizar decisiones condicionadas en la lógica de negocio.

class Course {
  constructor(name, isFree = false, lang = 'Spanish') {
    this.name = name;
    this.isFree = isFree;
    this.lang = lang;
  }
}

const basicCourse = new Course('Curso de Programación Básica', true);

Finalmente, es importante probar la funcionalidad en un entorno adecuado para asegurarse de que las validaciones funcionan correctamente. Cambiar las instancias y comprobar que se comportan como se espera garantiza que el sistema cumpla sus objetivos.

Implementar herencia en JavaScript mediante clases y subclases ofrece un potente mecanismo para construir aplicaciones modulares y escalables. Esta práctica anima a los desarrolladores a explorar otras técnicas y paradigmas de programación orientada a objetos, enriqueciendo su competencia técnica y profesional.