POO: Programación Orientada a Objetos

20 de septiembre de 2024

La Programación Orientada a Objetos (POO) es un paradigma fundamental en el desarrollo de software, permitiendo organizar el código en torno a objetos que encapsulan datos y comportamientos. En JavaScript, aunque originalmente basado en prototipos, se pueden aplicar los principios de POO utilizando clases y objetos.


1. ¿Qué es la Programación Orientada a Objetos?

La POO es un modelo de programación basado en la creación y manipulación de objetos, los cuales son instancias de clases. Estos objetos contienen propiedades (datos) y métodos (funciones que operan sobre los datos).

Ejemplo en JavaScript:

class Coche {
  constructor(marca, modelo) {
    this.marca = marca;
    this.modelo = modelo;
  }

  mostrarInformacion() {
    return `Este coche es un ${this.marca} ${this.modelo}`;
  }
}

const miCoche = new Coche("Toyota", "Corolla");
console.log(miCoche.mostrarInformacion()); // "Este coche es un Toyota Corolla"

2. Los Pilares de la Programación Orientada a Objetos

2.1 Abstracción

La abstracción permite ocultar los detalles de implementación y exponer solo lo necesario. En JavaScript, esto se logra utilizando clases y métodos públicos para interactuar con los objetos sin exponer detalles internos.

Ejemplo:

class Usuario {
  constructor(nombre, edad) {
    this.nombre = nombre;
    this.edad = edad;
  }

  obtenerDetalles() {
    return `${this.nombre} tiene ${this.edad} años`;
  }
}

const usuario1 = new Usuario("Carlos", 30);
console.log(usuario1.obtenerDetalles());

Aquí, el usuario solo interactúa con el método obtenerDetalles() sin conocer cómo está estructurada la clase internamente.


2.2 Encapsulación

La encapsulación restringe el acceso a ciertos datos dentro del objeto, protegiéndolos de modificaciones no autorizadas. En JavaScript, se logra mediante propiedades privadas usando #.

Ejemplo:

class CuentaBancaria {
  #saldo;
  constructor(saldoInicial) {
    this.#saldo = saldoInicial;
  }

  depositar(cantidad) {
    this.#saldo += cantidad;
  }

  obtenerSaldo() {
    return this.#saldo;
  }
}

const cuenta = new CuentaBancaria(1000);
cuenta.depositar(500);
console.log(cuenta.obtenerSaldo()); // 1500
console.log(cuenta.#saldo); // Error: propiedad privada

El saldo no puede ser accedido directamente, garantizando seguridad.


2.3 Herencia

La herencia permite que una clase reutilice propiedades y métodos de otra clase base, evitando la repetición de código.

Ejemplo:

class Animal {
  constructor(nombre) {
    this.nombre = nombre;
  }
  hacerSonido() {
    return "Sonido genérico";
  }
}

class Perro extends Animal {
  hacerSonido() {
    return "Ladrido";
  }
}

const miPerro = new Perro("Fido");
console.log(miPerro.hacerSonido()); // "Ladrido"

Aquí, Perro hereda de Animal pero sobrescribe el método hacerSonido().


2.4 Polimorfismo

El polimorfismo permite que métodos con el mismo nombre en distintas clases se comporten de manera diferente según el contexto.

Ejemplo:

class Figura {
  calcularArea() {
    return 0;
  }
}

class Cuadrado extends Figura {
  constructor(lado) {
    super();
    this.lado = lado;
  }
  calcularArea() {
    return this.lado * this.lado;
  }
}

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

const figuras = [new Cuadrado(4), new Circulo(3)];
figuras.forEach((figura) => console.log(figura.calcularArea()));

Cada objeto calcula el área de manera distinta según su forma.


La Programación Orientada a Objetos en JavaScript es una poderosa herramienta para estructurar el código de manera modular, reutilizable y mantenible. Los pilares fundamentales—abstracción, encapsulación, herencia y polimorfismo—permiten desarrollar aplicaciones más organizadas y escalables. Con la introducción de class en ES6, JavaScript ha facilitado aún más la implementación de POO, haciéndola accesible tanto para principiantes como para desarrolladores experimentados.

Si deseas profundizar en estos conceptos, te recomiendo practicar creando tus propias clases y aplicando estos principios en proyectos reales.