Domanda ClojureScript interop


Sto cercando di scoprire come accedere alle proprietà degli oggetti Javascript in ClojureScript. Se conosco in anticipo il nome della proprietà, è facile. Ottenere foo.bar Lo faccio e basta

(.-bar foo)

C'è un modo per accedere a una proprietà il cui nome è noto solo in fase di runtime? Sto cercando l'equivalente della sintassi JS foo[dynamicBar]


13
2018-03-25 15:47


origine


risposte:


È possibile utilizzare aget / aset per accedere a proprietà note solo al runtime.

;; Use clj->js to convert clj(s) map to javascript.
;; Note the #js {:bar 100} reader literal indicating a js map.

cljs.user> (def foo (clj->js {:bar 100}))
#js {:bar 100}
cljs.user> (.-bar foo) 
100
cljs.user> (aget foo "bar")
100
cljs.user> (aset foo "baz" 200)
200
cljs.user> (.-baz foo) 
200

19
2018-03-25 17:42



L'utilizzo dei nomi di stringa può essere importante anche nel caso in cui si desideri trarre vantaggio da: ottimizzazioni: modalità di compilazione avanzata, ma non si dispone di un file externs che copra il codice.

Guarda l'esempio di David Nolen usando goog.object.get: https://github.com/clojure/clojurescript/wiki/Dependencies#using-string-names

Mentre aget lavori. In origine questo metodo doveva fornire l'accesso agli elementi dell'array, non alle proprietà degli oggetti js in generale. Il metodo get di goog.object è un modo migliore per comunicare il tuo intento.

Ecco le implementazioni di entrambi i metodi: https://github.com/google/closure-library/blob/1b8a893271d790626b5cd652b922675c987f106d/closure/goog/object/object.js#L403

https://github.com/clojure/clojurescript/blob/d2d031605b1ad552077218c8f445868653c01744/src/main/clojure/cljs/core.cljc#L942

Come potete vedere, (aget o key)genera codice javascript o[key] direttamente, ma goog.object.get chiama un metodo che prima controlla se la chiave è presente in o.


0
2017-11-26 15:23