我想了解如何访问ClojureScript中的Javascript对象属性。如果我事先知道财产的名称,那很容易。为了得到foo.bar
我只是做ClojureScript interop
(.-bar foo)
是否有访问他的名字只在运行时已知的属性的方法吗?我正在寻找相当于JS的语法
foo[dynamicBar]
我想了解如何访问ClojureScript中的Javascript对象属性。如果我事先知道财产的名称,那很容易。为了得到foo.bar
我只是做ClojureScript interop
(.-bar foo)
是否有访问他的名字只在运行时已知的属性的方法吗?我正在寻找相当于JS的语法
foo[dynamicBar]
您可以使用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
使用字符串名称可以的情况下,也很重要,当你想利用:优化:先进的编译器模式,但你没有实习医生文件覆盖你的代码。
使用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
正如你可以看到,(aget o key)
直接生成JavaScript代码o[key]
,但goog.object.get调用一个方法,该方法首先检查键存在于o中。
恕我直言,直接使用goog.object.get是clojurescript中的一种反模式。它使得代码更加丑陋。如果需要支票,很容易在没有这个的情况下进行。如果它通常是想要的然后可以说aget应该那样做或有一个可选的参数来做到这一点。或者可以简单地推出自己的产品。大多数情况下都比把丑陋的关闭全名全部放在首位。 – 2016-02-10 22:36:23
有人可能想知道,(至少在今天)可以使用'(js-obj“bar”100)',避免需要js *。 – 2013-08-29 16:49:39