2012-03-25 5 views
13

ClojureScriptでJavascriptオブジェクトのプロパティにアクセスする方法を調べようとしています。私がプロパティの名前を事前に知っていれば、それは簡単です。私は名前だけ実行時にのみ知られているプロパティにアクセスする方法はありClojureScript interop

(.-bar foo) 

行うfoo.barを取得するには?私は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 *の必要を避けて、 '(js-obj" bar "100")を使うことが(少なくとも今日は)可能であることを知りたいかもしれません。 –

0

は場合にも重要であろう。

goog.object.get使用を参照してくださいデビッド・ノレンの例: https://github.com/clojure/clojurescript/wiki/Dependencies#using-string-names

ながらaget作品を。このメソッドはもともとjsオブジェクトのプロパティではなく、配列要素へのアクセスを提供することになっていました。 goog.objectのgetメソッドは、あなたの意図を伝える良い方法です。

ここ

は、両方の方法の実装である:あなたが見ることができるように(aget o key)直接JavaScriptコードo[key]を生成し、 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

が、goog.object.getキー場合た最初のチェックメソッドを呼び出しますoに存在する。

+0

goog.object.getを使用しているIMHOは、clojurescriptのアンチパターンです。それは醜いコードになります。小切手が必要な場合は、これを入れないと簡単に入れられません。それが一般的に必要な場合は、間違いなくagetがそれを行うか、それを行うためのオプションのパラメータを持つ必要があります。あるいは、自分自身を単に動かすこともできます。ほとんどのものは、場所のいたるところに醜いクロージャフルネームを置くよりも好ましい。 –