我想了解如何訪問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