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(); // 3Para 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(); // 3Las 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:
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.class .Un cierre tiene estas ventajas:
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.
No, las clases no siempre son mejores. Simplemente son diferentes. Yo diría que las principales diferencias son
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.
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.