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.