如何使用字符串名称调用函数(需要参数)- Clojurescript | d3

How to call a function (requiring args) with string name - Clojurescript | d3

我正在尝试对调用 d3 对象 (node) 上的函数 (.attr) 的函数 (set-attr) 进行一些重构。我希望能够将对象函数 (.attr) 与 set-attr.

分离

但我一直收到此错误 Cannot read property 'each' of null

我希望有人在 Cljs 中使用过 d3 互操作并且知道可以工作的东西,因为它在常规 js 对象上工作得很好。

有效的函数

(defn set-attr [node [attr settr]]
  (.attr node attr settr))

我认为应该可行(但给我错误)

(defn set-attr [node [attr settr]]
  ((aget node "attr") attr settr))

在常规 js 对象上工作正常

((aget (clj->js {:foo (fn [x y] (str "hi" x y))}) "foo" ) "ryan" "lol")
;; => "hiryanlol"

d3 uses inheritance。因此,您不能将此对象仅作为散列-table 来处理。你必须接触到它的原型才能得到你想要的东西,这通常不是一个好主意:这会产生相当脆弱的代码。