13

我试图找出如何访问 ClojureScript 中的 Javascript 对象属性。如果我事先知道该物业的名称,那很容易。为了得到foo.bar我只是做

(.-bar foo)

有没有办法访问名称仅在运行时才知道的属性?我正在寻找等效的 JS 语法foo[dynamicBar]

4

2 回答 2

19

您可以使用 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
于 2012-03-25T17:42:21.010 回答
0

如果您想利用 :optimizations :advanced 编译器模式,但您没有覆盖代码的 externs 文件,使用字符串名称可能也很重要。

请参阅 David Nolen 的示例goog.object.gethttps ://github.com/clojure/clojurescript/wiki/Dependencies#using-string-names

虽然aget工作。此方法最初应该为您提供对数组元素的访问,而不是一般的 js 对象的属性。goog.object 的 get 方法是传达您的意图的更好方法。

以下是这两种方法的实现: 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

如您所见,直接(aget o key)生成 javascript 代码o[key],但 goog.object.get 调用一个方法,该方法首先检查密钥是否存在于 o 中。

于 2015-11-26T15:23:43.447 回答