Polimorfismo en JavaScript: Despacho Dinámico y Duck Typing
Aprende cómo opera el polimorfismo en un lenguaje de tipado dinámico mediante la filosofía de Duck Typing para escribir código desacoplado y flexible.
Polimorfismo sin Interfaces Rígidas
En lenguajes como Java o PHP, para lograr polimorfismo es obligatorio declarar una interfaz formal (interface Pagable) y obligar a las clases a firmar el contrato con implements.
En JavaScript, al ser un lenguaje de tipado dinámico, no existen las interfaces en tiempo de ejecución. En su lugar, el polimorfismo se rige por un principio fundamental de la computación conocido como Duck Typing (Tipado de Pato).
¿Qué es el "Duck Typing"?
"Si camina como un pato y grazna como un pato, entonces para todos los efectos prácticos... es un pato."
A una función o servicio en JavaScript no le importa de qué clase o prototipo proviene un objeto. Lo único que le importa es: ¿posee el método o la propiedad que necesito invocar?
- Si le pasas un objeto que tiene un método
procesar(monto), el código funcionará con total éxito, ya sea una claseStripe, un objeto literal{ procesar: () => {} }o un mock de pruebas.
Eliminación de Sentencias `switch` y `if`
El polimorfismo permite que una función procese una lista heterogénea de objetos sin preguntar jamás if (tipo === 'paypal'):
// Despacho Polimórfico Elegante
for (const canal of canalesAlerta) {
canal.enviar("Tu código de verificación"); // Cada objeto responde a su manera
}
⚡ Motor de Pagos Polimórfico con Duck Typing en JavaScript
Ejecuta el código en el Sandbox y observa cómo Checkout procesa pasarelas heterogéneas sin condicionales:
// 1. Proveedor A: Clase Estructurada con ES6
class StripeGateway {
nombre = "Stripe Credit Card";
procesarPago(monto) {
console.log(`💳 [Stripe API] Tokenizando tarjeta y debitando $${monto.toFixed(2)}.`);
return { exito: true, transaccionId: "ch_" + Math.random().toString(36).substring(2, 9) };
}
}
// 2. Proveedor B: Clase con lógica distinta
class PayPalGateway {
nombre = "PayPal Wallet";
procesarPago(monto) {
console.log(`🅿️ [PayPal Orders] Redirigiendo a aprobación y cobrando $${monto.toFixed(2)}.`);
return { exito: true, transaccionId: "PAYID-" + Math.floor(10000 + Math.random() * 90000) };
}
}
// 3. Proveedor C: Objeto Literal Puro (Duck Typing en su máxima expresión)
// ¡Ni siquiera es una clase, pero cumple el contrato porque "grazna como pato"!
const fakeMockTestingGateway = {
nombre: "Mock Fake (Ambiente de Pruebas Unitarias)",
procesarPago(monto) {
console.log(`🧪 [Mock Testing] Simulando aprobación instantánea de $${monto.toFixed(2)} sin dinero real.`);
return { exito: true, transaccionId: "TEST-MOCK-999" };
}
};
// 4. Servicio de Checkout Desacoplado
class CheckoutService {
cobrarPedido(pasarela, cliente, total) {
// Validación defensiva opcional (comprobar que grazne como pato)
if (typeof pasarela.procesarPago !== 'function') {
throw new TypeError(`El proveedor recibido no implementa el método procesarPago()`);
}
console.log(`\n🛒 Iniciando compra de [${cliente}] por $${total.toFixed(2)} con: ${pasarela.nombre}`);
const resultado = pasarela.procesarPago(total);
if (resultado.exito) {
console.log(` Factura emitida con ID de Transacción: ${resultado.transaccionId}`);
}
}
}
// ==========================================
// PRUEBA POLIMÓRFICA EN EL SANDBOX
// ==========================================
const checkout = new CheckoutService();
// Caso 1: Pagando con Stripe
checkout.cobrarPedido(new StripeGateway(), "Carlos Mendoza", 149.99);
// Caso 2: Pagando con PayPal
checkout.cobrarPedido(new PayPalGateway(), "Valeria Torres", 89.00);
// Caso 3: Pruebas automatizadas con el objeto literal
checkout.cobrarPedido(fakeMockTestingGateway, "Usuario Pruebas", 10.00);
Mini-Quiz de Retención
Comprueba tu comprensión antes de pasar a la siguiente lección¿Qué describe la filosofía de "Duck Typing" en la Programación Orientada a Objetos en JavaScript?
¿Tienes dudas con este tema?
Sócrates AI puede darte analogías y explicarte este código paso a paso.🚀 ¿Quieres dominar Manual de Programación Orientada a Objetos en JavaScript (POO) y crear proyectos reales?
Aprende arquitectura limpia, desarrollo web moderno, buenas prácticas y despliegue en producción con nuestro Bootcamp Fullstack Developer con mentorías en vivo.
🏛️ Autoría y Propiedad Intelectual: Obra educativa original de David Amador para Kilopolis Academia (Solucionáticos), estructurada sobre las especificaciones y estándares abiertos del W3C, el estándar vivo de WHATWG y la documentación oficial de código abierto. © Todos los derechos reservados.