2012-03-25 53 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