我试图找出如何访问 ClojureScript 中的 Javascript 对象属性。如果我事先知道该物业的名称,那很容易。为了得到foo.bar
我只是做
(.-bar foo)
有没有办法访问名称仅在运行时才知道的属性?我正在寻找等效的 JS 语法
foo[dynamicBar]
我试图找出如何访问 ClojureScript 中的 Javascript 对象属性。如果我事先知道该物业的名称,那很容易。为了得到foo.bar
我只是做
(.-bar foo)
有没有办法访问名称仅在运行时才知道的属性?我正在寻找等效的 JS 语法
foo[dynamicBar]
您可以使用 get / aset 访问仅在运行时才知道的属性。
;; 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
如果您想利用 :optimizations :advanced 编译器模式,但您没有覆盖代码的 externs 文件,使用字符串名称可能也很重要。
请参阅 David Nolen 的示例goog.object.get
:
https ://github.com/clojure/clojurescript/wiki/Dependencies#using-string-names
虽然aget
工作。此方法最初应该为您提供对数组元素的访问,而不是一般的 js 对象的属性。goog.object 的 get 方法是传达您的意图的更好方法。
如您所见,直接(aget o key)
生成 javascript 代码o[key]
,但 goog.object.get 调用一个方法,该方法首先检查密钥是否存在于 o 中。