13

ClojureScriptでJavascriptオブジェクトのプロパティにアクセスする方法を見つけようとしています。物件名を事前に知っていれば簡単です。foo.bar私がするために

(.-bar foo)

実行時にのみ名前がわかっているプロパティにアクセスする方法はありますか?JS構文に相当するものを探していますfoo[dynamicBar]

4

2 に答える 2

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
于 2012-03-25T17:42:21.010 に答える
0

:optimizations:advancedコンパイラモードを利用したいが、コードをカバーするexternsファイルがない場合は、文字列名を使用することも重要です。

https://github.com/clojure/clojurescript/wiki/Dependencies#using-string-namesを使用したDavidNolenの例を参照してgoog.object.getください 。

動作中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に存在するかどうかを最初にチェックするメソッドを呼び出します。

于 2015-11-26T15:23:43.447 に答える