Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

134
Views
Closures VS Classes en Javascript moderno

Para los cierres cuyo objetivo principal es crear otras funciones, me preguntaba si en javascript moderno, es mejor usar clases en javascript moderno.

 // Closure way private counter const countPlusOne = () => { let count = 0; return () =>{ count++; console.log(count); } } let demoAdd = countPlusOne(); demoAdd(); // 1 demoAdd(); // 2 demoAdd(); // 3

Para ser honesto, nunca me gustó el uso de cierres de esa manera (pero creo que son geniales para cosas como middlewares) ya que son difíciles de leer.

Entonces, ¿debería refactorizar cierres como el de arriba, a clases? Su comportamiento parece más análogo al de los Objetos típicos de otros lenguajes.

 // Class way private counter class countPlusClass{ count = 0; add(){ this.count++; console.log(this.count) } } const demo = new countPlusClass(); demo.add(); // 1 demo.add(); // 2 demo.add(); // 3
about 4 years ago · Juan Pablo Isaza
3 answers
Answer question

0

Las clases no siempre son mejores. Realmente depende de las circunstancias. Cada uno tiene su lugar en su conjunto de herramientas de programación.

Una clase tiene las siguientes ventajas:

  1. Hay una sintaxis definida en el lenguaje.
  2. Puede subclasificar una clase para extenderla
  3. Puede tener más fácilmente muchas propiedades y muchos métodos.
  4. Los métodos son automáticamente no enumerables y se ejecutan en modo estricto.
  5. La sintaxis en el código que usa una clase describe de alguna manera lo que está sucediendo, ya que new countPlusClass() deja en claro que está creando un objeto que luego tendrá métodos y probablemente estado. Eso no es tan obvio con el cierre que muestras.
  6. Para objetos con muchos métodos, existe un beneficio de ahorro de espacio para el prototipo que usa una class .
  7. Las herramientas de desarrollo reconocerán una instancia de una clase y sabrán cómo mostrarla, autocompletar al escribir código para ella, cómo representarla en el depurador, cómo usarla en mensajes de error, etc.

Un cierre tiene estas ventajas:

  1. Los datos en el cierre son completamente privados. Nadie puede acceder a él desde fuera del cierre.
  2. En algunas circunstancias, la persona que llama puede encontrar que se necesita menos código para usar el cierre ya que realiza una llamada de función (a veces pasando argumentos) y obtiene otra función que luego implementa la única cosa que se supone que debe hacer (su mención de middleware viene a la mente).

Entonces, diría que si desea, necesita o valora alguno de los beneficios de la clase, entonces use la clase.

Si no quiere o necesita ninguno de los beneficios de la clase y la interfaz más simple del cierre satisface sus necesidades o si realmente necesita la privacidad del cierre, entonces puede elegir el cierre.

Yo diría que para una circunstancia dada, una de estas herramientas puede ser mejor "adecuada" para el problema en cuestión.


Como se mencionó en los comentarios, también puede tener funciones de fábrica que pueden ser cierres (retener el estado privado en un cierre) y pueden devolver un objeto con métodos y/o propiedades que incluso pueden ser un objeto creado al instanciar una clase. Por lo tanto, estos conceptos también se pueden combinar para obtener algunos de los beneficios de ambos.

about 4 years ago · Juan Pablo Isaza Report

0

No, las clases no siempre son mejores. Simplemente son diferentes. Yo diría que las principales diferencias son

  • la interfaz de la cosa devuelta por la función constructor/fábrica. Una instancia de clase tiene propiedades y métodos, y generalmente varios de ellos, mientras que un cierre es simplemente una función a la que puede llamar, con una sola funcionalidad. La sintaxis para invocarlos es diferente, el nombre del método adicional a veces es superfluo y otras veces beneficioso.
  • En OOP, se espera que los objetos tengan una identidad y un estado. En FP, se espera que las funciones sean puras. Claro, no necesita seguir un paradigma específico, y los objetos sin estado están bien, al igual que las funciones impuras (aunque tal vez los llame "procedimientos"), pero tenga en cuenta estas convenciones cuando discuta sobre la legibilidad y la mantenibilidad.

Así que elige sabiamente. ¿Necesita (posiblemente en el futuro) múltiples métodos? ¿Encapsulas el estado? Luego usa una class para crear objetos. ¿Solo necesitas una función para llamar? Luego crea un cierre.

about 4 years ago · Juan Pablo Isaza Report

0

Un cierre tiene una ventaja significativa sobre una clase de la forma en que te lo estás imaginando: con una clase, si usas un campo de clase pública como lo estás haciendo, cualquier código con acceso a la instancia puede modificar su valor. Esto generalmente no es deseable: el alcance generalmente debe estar lo más restringido posible y no desea que la corrección de su clase dependa de que los consumidores de la clase no la modifiquen (ya sea accidental o deliberadamente).

 class countPlusClass{ count = 0; add(){ this.count++; console.log(this.count) } } const demo = new countPlusClass(); demo.add(); // 1 demo.add(); // 2 // some code elsewhere in the codebase that has access to the demo instance: demo.count = 55555; demo.add(); // not 3...

Los cierres, por el contrario, son completamente privados ( salvo circunstancias extrañas y excepcionales ).

Si tuviera que usar una clase y quisiera emular la privacidad de los cierres, asegúrese de usar campos de clase privados en su lugar, para que no se puedan modificar fuera de la clase.

 class countPlusClass{ #count = 0; add(){ this.#count++; console.log(this.#count) } } const demo = new countPlusClass(); demo.add(); // 1 demo.add(); // 2 // some code elsewhere in the codebase that has access to the demo instance // cannot modify the private field demo.count = 55555; demo.add(); // not 3...

¿Qué es mejor, un objeto basado en cierre o una clase? Eso depende de cada desarrollador individual.

about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!