Comment créer un objet JS avec des méthodes et un constructeur dans Clojurescript
-
14-11-2019 - |
Question
Imaginez que la tâche consiste à créer une lib utilitaire dans Clojurescript afin qu'elle puisse être utilisée à partir de JS.
Par exemple, disons que je veux produire un équivalent de:
var Foo = function(a, b, c){
this.a = a;
this.b = b;
this.c = c;
}
Foo.prototype.bar = function(x){
return this.a + this.b + this.c + x;
}
var x = new Foo(1,2,3);
x.bar(3); // >> 9
Une façon d'y parvenir, je suis venue avec est:
(deftype Foo [a b c])
(set! (.bar (.prototype Foo))
(fn [x]
(this-as this
(+ (.a this) (.b this) (.c this) x))))
(def x (Foo. 1 2 3))
(.bar x 3) ; >> 9
Question: Y a-t-il une manière plus élégante / idiomatique de ce qui précède dans Clojurescript?
La solution
Cela a été résolu avec Jira CLJS-83 En ajoutant un protocole magique "objet" au deftype:
(deftype Foo [a b c]
Object
(bar [this x] (+ a b c x)))
(def afoo (Foo. 1 2 3))
(.bar afoo 3) ; >> 9
Autres conseils
(defprotocol IFoo
(bar [this x]))
(deftype Foo [a b c]
IFoo
(bar [_ x]
(+ a b c x)))
(def afoo (Foo. 1 2 3))
(bar afoo 3) ; >> 9
Est la façon idiomatique de le faire.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow