2 votes

Fermeture qui instancie une classe en JavaScript

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

1voto

Mr Robot Points 775

Votre fonction devrait retourner le nouvel objet :

// Closure instantiating the class
var obj = function(init)
{
    return  new myClass(init);
}

J'ai mis à jour le violon : https://jsfiddle.net/48mr2t5y/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X