Funcional vs POO en JS: ¿qué elegir en 2024?

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Dos caras de una misma moneda: Enfoque funcional vs orientado a objetos en JavaScript

\n\n

Si alguna vez te has preguntado por qué algunos desarrolladores escriben código que parece una fórmula matemática, y otros, como un manual de instrucciones para montar muebles de Ikea, te has topado con el eterno debate: programación funcional (PF) frente a programación orientada a objetos (POO) en JavaScript.

\n\n

JavaScript es un lenguaje único. Nació como un lenguaje de scripting para botones y se convirtió en un monstruo que lo puede todo. Es multiparadigma: puedes escribir en él en estilo procedural, POO o funcional. Y aquí es donde empieza lo interesante. ¿Qué enfoque debería elegir un principiante? ¿Y un desarrollador experimentado? Analicémoslo sin fanatismos, con ejemplos reales.

\n\n

Brevemente sobre lo esencial: ¿qué es qué?

\n\n

El enfoque orientado a objetos (POO) trata sobre "entidades". Tienes objetos (gato, coche, usuario), que tienen propiedades (color, velocidad, nombre) y métodos (maullar, conducir, iniciar sesión). Agrupas datos y comportamiento juntos. Lo clásico: class Coche { conducir() {} }.

\n\n

El enfoque funcional (PF) trata sobre "acciones". Los datos y las funciones están separados. Las funciones son transformadores puros: con unos datos de entrada, se obtienen otros de salida, sin efectos secundarios. Nada de this, mutaciones ni estado oculto.

\n\n

La ironía es que JavaScript no es ideal para ninguno de los dos "de fábrica", pero permite usar ambos estilos de forma elegante. La cuestión es cuándo aplicar cada uno.

\n\n

POO en JavaScript: de prototipos a clases ES6

\n\n

Hace mucho tiempo, en la era de IE6, la POO en JS parecía aterradora. Todo se basaba en prototipos: un mecanismo donde los objetos heredan propiedades de otros objetos. Era potente, pero no intuitivo.

\n\n

Con la llegada de ES6 (ES2015), se añadió azúcar sintáctico al lenguaje: class. Pero es importante entender: bajo el capó, siguen siendo los mismos prototipos. Las clases hicieron el código más limpio y comprensible para quienes venían de Java o C++.

\n\n

Ejemplo de POO: Clase "Usuario"

\n\n
class Usuario {\n  constructor(nombre, email) {\n    this.nombre = nombre;\n    this.email = email;\n    this.iniciadoSesion = false;\n  }\n\n  iniciarSesion() {\n    this.iniciadoSesion = true;\n    return `${this.nombre} inició sesión`;\n  }\n\n  cerrarSesion() {\n    this.iniciadoSesion = false;\n    return `${this.nombre} cerró sesión`;\n  }\n}\n\nconst admin = new Usuario('Ana', 'ana@ejemplo.com');\nconsole.log(admin.iniciarSesion()); // Ana inició sesión\n
\n\n

Todo es lógico: los datos (nombre, email) viven junto con los métodos (iniciarSesion, cerrarSesion). El estado del objeto cambia a través de sus propios métodos. Esto es la encapsulación clásica.

\n\n

Problemas de la POO en JS

\n
    \n
  • El contexto this. La pérdida de contexto es el azote de los principiantes. Si pasas un método como callback, this se "rompe". Hay que usar .bind(), funciones flecha o closures.
  • \n
  • Herencia. Las jerarquías profundas de clases ("Problema del diamante") generan confusión. A menudo, la composición (mixins) resulta mejor que la herencia.
  • \n
  • Estado. El estado mutable (cuando modificamos las propiedades de un objeto) es la principal fuente de errores en proyectos grandes. Un método puede cambiar accidentalmente algo que no debería.
  • \n
\n\n

Enfoque funcional: pureza y previsibilidad

\n\n

Los funcionalistas miran la POO con una leve sonrisa. Su lema: "Los datos son datos, las funciones son funciones. No los mezcles".

\n\n

Conceptos clave de la programación funcional en JavaScript:

\n