J'ai écrit une classe simple de JS :
// JS simple class
class myClass
{
constructor(init=0) { this.var = init; }
add(n) { this.var+=n; return this; }
sub(n) { this.var-=n; return this; }
}
La classe peut être utilisée avec le chaînage de méthodes :
// Works well
obj1 = new myClass(0);
obj1.add(5);
obj1.sub(2);
console.log (obj1.var);
// Method chaining, works well
obj2 = new myClass(0);
obj2.add(9).sub(4).add(3);
console.log (obj2.var);
Je voudrais créer une fermeture pour des raisons de commodité, afin que la classe puisse être utilisée sans créer explicitement un nouvel objet. Par exemple, je voudrais quelque chose comme :
obj(0).add(5).sub(2);
Lors de l'appel obj(0)
une nouvelle instance de la classe est créée. J'ai écrit la fermeture suivante, mais celle-ci ne fonctionne pas :
// Closure instantiating the class
var obj = function(init)
{
var obj = new myClass(init)
return { add:this.add, sub:this.sub };
}
Lors de l'appel obj(0).add(3);
l'erreur suivante s'affiche dans la console :
Uncaught TypeError: obj(...).add is not a function at window.onload ((index):58)
Je ne sais pas comment faire, et je ne suis même pas sûr que la fermeture soit le bon outil.
Notez que j'ai déjà une solution fonctionnelle sans classe (avec des fermetures), mais je voudrais garder ma classe.
J'ai fait un JSFiddle ici