ClojureScript属性访问器功能

时间:2013-07-11 19:29:19

标签: clojurescript

我需要将属性访问器传递给函数,例如:

(defn test [access]
  (.log js/console (str (access js/window))))

(test #(.-screenLeft %))

这是最好的方法吗?以下不起作用:

(test .-screenLeft)

2 个答案:

答案 0 :(得分:4)

一般来说,你的是在Clojure中这样做的规范方法。

在ClojureScript中,这通常也是最好的方法;主要的问题是有两种方法可以在JavaScript和ClojureScript中引入属性:

  • 索引样式 - a["foo"] / (aget a "foo");

  • 点缀属性样式 - a.foo / (.-foo a)

如果您希望代码在高级模式下编译,则需要确保不要将它们混合到同一属性中。 (在将属性引入一个模式的意义上混合,然后使用另一个模式进行访问。)这是因为Google Closure编译器可以自由地重命名使用点状属性样式引入的属性,而使用它独立留下的索引样式引入的属性。

NB。这不适用于JavaScript环境(js/alert等)提供的显式导出的属性和符号。

答案 1 :(得分:2)

我认为你的解决方案很好,但你可能会喜欢这样的东西:

(defn test [access]
  (->> access name (aget js/window) str (.log js/console)))

利用name,您现在可以通过以下任何方式访问媒体资源screenLeft

(test :screenLeft) 
(test 'screenLeft)
(test "screenLeft")