【问题标题】:ClojureScript interopClojureScript 互操作
【发布时间】:2012-03-25 15:47:30
【问题描述】:

我正在尝试了解如何在 ClojureScript 中访问 Javascript 对象属性。如果我事先知道该物业的名称,那很容易。要得到foo.bar 我只是这样做

(.-bar foo)

有没有办法访问名称仅在运行时才知道的属性?我正在寻找相当于 JS 语法 foo[dynamicBar]

【问题讨论】:

    标签: clojure interop clojurescript


    【解决方案1】:

    您可以使用 get / 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
    

    【讨论】:

    • 人们可能想知道(至少在今天)可以使用(js-obj "bar" 100),从而避免需要 js*。
    【解决方案2】:

    如果您想利用 :optimizations :advanced 编译器模式,但您的代码没有 externs 文件,则使用字符串名称可能也很重要。

    查看 David Nolen 使用 goog.object.get 的示例: 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

    https://github.com/clojure/clojurescript/blob/d2d031605b1ad552077218c8f445868653c01744/src/main/clojure/cljs/core.cljc#L942

    如你所见,(aget o key)直接生成javascript代码o[key],但goog.object.get调用的方法首先检查密钥是否存在于o中。

    【讨论】:

    • 恕我直言,直接使用 goog.object.get 是 clojurescript 中的反模式。它使代码更丑陋。如果需要支票,则无需此即可轻松放入。如果通常需要它,那么可以说 get 应该这样做或者有一个可选参数来做到这一点。或者可以简单地滚动自己的。大多数事情都比在所有地方都放置丑陋的闭包全名更可取。
    猜你喜欢
    • 1970-01-01
    • 2011-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-17
    • 2018-12-27
    • 2010-10-19
    相关资源
    最近更新 更多