ClojureScript взаимодействие - PullRequest
13 голосов
/ 25 марта 2012

Я пытаюсь выяснить, как получить доступ к свойствам объектов Javascript в ClojureScript.Если я заранее знаю название объекта, это легко.Чтобы получить foo.bar, я просто делаю

(.-bar foo)

Есть ли способ получить доступ к свойству, имя которого известно только во время выполнения?Я ищу эквивалент синтаксиса JS foo[dynamicBar]

Ответы [ 2 ]

19 голосов
/ 25 марта 2012

Вы можете использовать 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
0 голосов
/ 26 ноября 2015

Использование имен строк также может быть важно в том случае, если вы хотите воспользоваться: оптимизациями: расширенный режим компилятора, но у вас нет файла externs, охватывающего ваш код.

См. Пример Дэвида Нолена с использованием goog.object.get: https://github.com/clojure/clojurescript/wiki/Dependencies#using-string-names

Пока aget работает.Первоначально предполагалось, что этот метод предоставит вам доступ к элементам массива, а не к свойствам объектов js в целом.Метод get goog.object - лучший способ сообщить о своих намерениях.

Вот реализации обоих методов: 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.

...