2012-03-25 39 views
13

我想了解如何访问ClojureScript中的Javascript对象属性。如果我事先知道财产的名称,那很容易。为了得到foo.bar我只是做ClojureScript interop

(.-bar foo) 

是否有访问他的名字只在运行时已知的属性的方法吗?我正在寻找相当于JS的语法foo[dynamicBar]

回答

19

您可以使用aget/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 
+1

有人可能想知道,(至少在今天)可以使用'(js-obj“bar”100)',避免需要js *。 – 2013-08-29 16:49:39

0

使用字符串名称可以的情况下,也很重要,当你想利用:优化:先进的编译器模式,但你没有实习医生文件覆盖你的代码。

使用goog.object.get见David诺伦的例子: https://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中。

+0

恕我直言,直接使用goog.object.get是clojurescript中的一种反模式。它使得代码更加丑陋。如果需要支票,很容易在没有这个的情况下进行。如果它通常是想要的然后可以说aget应该那样做或有一个可选的参数来做到这一点。或者可以简单地推出自己的产品。大多数情况下都比把丑陋的关闭全名全部放在首位。 – 2016-02-10 22:36:23