JavaScript: Programación Orientada a Objetos

Aprende programación orientada a objetos en JavaScript con conceptos esenciales como clases, herencia, encapsulación y polimorfismo para código eficiente.

Aprende JavaScript GRATIS y certifícate

Programación Orientada a Objetos en JavaScript

La programación orientada a objetos (POO) representa uno de los paradigmas más influyentes en el desarrollo de software moderno. En JavaScript, este paradigma ha evolucionado significativamente desde sus primeras implementaciones basadas en prototipos hasta la introducción de la sintaxis de clases en ES6, proporcionando a los desarrolladores herramientas más familiares y expresivas para estructurar código complejo.

JavaScript implementa la POO de manera única, combinando características de lenguajes basados en clases con su sistema nativo de prototipos. Esta dualidad permite múltiples aproximaciones para crear y organizar objetos, desde la herencia prototípica tradicional hasta la sintaxis moderna de clases que facilita la transición desde otros lenguajes orientados a objetos.

Fundamentos de objetos en JavaScript

Los objetos constituyen la base fundamental de JavaScript. A diferencia de los tipos primitivos, los objetos pueden contener múltiples valores relacionados y funcionalidades asociadas. Un objeto agrupa propiedades (datos) y métodos (funciones) que operan sobre esos datos, creando unidades cohesivas de funcionalidad.

const usuario = {
  nombre: "Ana García",
  edad: 28,
  email: "ana@ejemplo.com",
  
  saludar() {
    return `Hola, soy ${this.nombre}`;
  }
};

La palabra clave this representa el contexto del objeto actual, permitiendo que los métodos accedan a las propiedades del mismo objeto. Este concepto resulta fundamental para entender cómo los objetos mantienen su estado interno y exponen comportamientos específicos.

Constructores y creación de objetos

Los constructores proporcionan plantillas para crear múltiples objetos con estructura similar. JavaScript ofrece varias aproximaciones para definir constructores, desde funciones constructoras tradicionales hasta la sintaxis moderna de clases.

function Producto(nombre, precio) {
  this.nombre = nombre;
  this.precio = precio;
  this.aplicarDescuento = function(porcentaje) {
    return this.precio * (1 - porcentaje / 100);
  };
}

const laptop = new Producto("Laptop Gaming", 1200);

La sintaxis de clases introduce una forma más clara y familiar de definir constructores:

class Vehiculo {
  constructor(marca, modelo) {
    this.marca = marca;
    this.modelo = modelo;
    this.encendido = false;
  }
  
  arrancar() {
    this.encendido = true;
    return `${this.marca} ${this.modelo} arrancado`;
  }
}

Herencia y extensión de funcionalidad

La herencia permite crear nuevas clases basadas en clases existentes, reutilizando y extendiendo funcionalidad. JavaScript implementa herencia tanto a través de prototipos como mediante la palabra clave extends en clases.

class Coche extends Vehiculo {
  constructor(marca, modelo, puertas) {
    super(marca, modelo);
    this.puertas = puertas;
  }
  
  abrirPuertas() {
    return `Abriendo las ${this.puertas} puertas del ${this.modelo}`;
  }
}

La función super() invoca el constructor de la clase padre, asegurando que la inicialización se realice correctamente en toda la jerarquía de herencia.

Encapsulación y control de acceso

La encapsulación protege el estado interno de los objetos, controlando cómo se accede y modifica la información. JavaScript moderno introduce campos privados utilizando la sintaxis de almohadilla (#):

class CuentaBancaria {
  #saldo = 0;
  #numeroCuenta;
  
  constructor(numeroCuenta) {
    this.#numeroCuenta = numeroCuenta;
  }
  
  depositar(cantidad) {
    if (cantidad > 0) {
      this.#saldo += cantidad;
      return this.#saldo;
    }
  }
  
  get saldoActual() {
    return this.#saldo;
  }
}

Los getters y setters proporcionan control adicional sobre el acceso a propiedades, permitiendo validación y procesamiento de datos:

class Temperatura {
  #celsius = 0;
  
  set celsius(valor) {
    if (valor >= -273.15) {
      this.#celsius = valor;
    }
  }
  
  get fahrenheit() {
    return (this.#celsius * 9/5) + 32;
  }
}

Polimorfismo y métodos dinámicos

El polimorfismo permite que objetos de diferentes tipos respondan a la misma interfaz de manera específica. JavaScript implementa polimorfismo a través de métodos con el mismo nombre que se comportan diferentemente según el objeto:

class Forma {
  calcularArea() {
    throw new Error("Método debe ser implementado");
  }
}

class Rectangulo extends Forma {
  constructor(ancho, alto) {
    super();
    this.ancho = ancho;
    this.alto = alto;
  }
  
  calcularArea() {
    return this.ancho * this.alto;
  }
}

class Circulo extends Forma {
  constructor(radio) {
    super();
    this.radio = radio;
  }
  
  calcularArea() {
    return Math.PI * this.radio ** 2;
  }
}

Composición y agregación

La composición ofrece una alternativa a la herencia, combinando objetos para crear funcionalidad compleja. Este enfoque proporciona mayor flexibilidad y evita las limitaciones de jerarquías de herencia profundas:

class Motor {
  constructor(potencia) {
    this.potencia = potencia;
    this.funcionando = false;
  }
  
  encender() {
    this.funcionando = true;
  }
}

class Automovil {
  constructor(marca, potenciaMotor) {
    this.marca = marca;
    this.motor = new Motor(potenciaMotor);
  }
  
  arrancar() {
    this.motor.encender();
    return `${this.marca} arrancado con motor de ${this.motor.potencia}HP`;
  }
}

La programación orientada a objetos en JavaScript proporciona herramientas versátiles para organizar código complejo, desde aplicaciones web interactivas hasta sistemas backend robustos. La comprensión de estos conceptos fundamentales establece la base para desarrollar software mantenible, escalable y bien estructurado.

Empezar curso de JavaScript

Lecciones de este módulo de JavaScript

Lecciones de programación del módulo Programación Orientada a Objetos del curso de JavaScript.

Ejercicios de programación en este módulo de JavaScript

Evalúa tus conocimientos en Programación Orientada a Objetos con ejercicios de programación Programación Orientada a Objetos de tipo Test, Puzzle, Código y Proyecto con VSCode.