【发布时间】:2012-03-25 15:47:30
【问题描述】:
我正在尝试了解如何在 ClojureScript 中访问 Javascript 对象属性。如果我事先知道该物业的名称,那很容易。要得到foo.bar 我只是这样做
(.-bar foo)
有没有办法访问名称仅在运行时才知道的属性?我正在寻找相当于 JS 语法
foo[dynamicBar]
【问题讨论】:
标签: clojure interop clojurescript
我正在尝试了解如何在 ClojureScript 中访问 Javascript 对象属性。如果我事先知道该物业的名称,那很容易。要得到foo.bar 我只是这样做
(.-bar foo)
有没有办法访问名称仅在运行时才知道的属性?我正在寻找相当于 JS 语法
foo[dynamicBar]
【问题讨论】:
标签: clojure interop clojurescript
您可以使用 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
【讨论】:
(js-obj "bar" 100),从而避免需要 js*。
如果您想利用 :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中。
【讨论】: