如何在ClojureScript中列出JavaScript对象的属性和函数?

9
有没有一种简单的方法可以在ClojureScript中列出JavaScript对象的属性和函数?
我尝试了以下方法:
(keys (js->clj (.getContext canvas "2d")))

但是这会抛出以下错误:
ExceptionInfo #<Error: [object CanvasRenderingContext2D] is not ISeqable>  clojure.core/ex-info (core.clj:4591)
2个回答

16
我找到了一种方法。你只需要打电话。
(js-keys (.getContext canvas "2d"))

并且这将列出JavaScript对象的所有函数和属性。


我认为它正在工作 => http://app.klipse.tech/?cljs_in=(def%20x%20%23js%20%7B%3Aa%20%22a%22%20%3Ab%20%22b%22%7D)%0A%0A(js-keys%20x) - Raphael Boukara

5
你正在调用Clojure函数keys,该函数返回(Clojure) map的键。要返回JavaScript对象的所有属性,你应该这样做:
(.keys js/Object myObject)

这类似于JavaScript代码:

Object.keys(myObject);
编辑: 我刚查看了js->clj的源代码-https://github.com/clojure/clojurescript/blob/master/src/main/cljs/cljs/core.cljs并且我也尝试使用canvas上下文(context)。问题是canvas上下文不是一个标准的js/Object,因此条件(identical? (type x) js/Object)未被满足,导致js->clj函数进入else分支,使js->clj行为像identity函数,这意味着它只是将上下文作为你传入的值返回。
(defprotocol IEncodeClojure
  (-js->clj [x options] "Transforms JavaScript values to Clojure"))

(defn js->clj
  "Recursively transforms JavaScript arrays into ClojureScript
   vectors, and JavaScript objects into ClojureScript maps.  With
   option ':keywordize-keys true' will convert object fields from
   strings to keywords."
 ([x] (js->clj x {:keywordize-keys false}))
 ([x & opts]
   (let [{:keys [keywordize-keys]} opts
      keyfn (if keywordize-keys keyword str)
      f (fn thisfn [x]
          (cond
            (satisfies? IEncodeClojure x)
            (-js->clj x (apply array-map opts))

            (seq? x)
            (doall (map thisfn x))

            (coll? x)
            (into (empty x) (map thisfn x))

            (array? x)
            (vec (map thisfn x))

            (identical? (type x) js/Object)
            (into {} (for [k (js-keys x)]
                       [(keyfn k) (thisfn (aget x k))]))

            :else x))]
       (f x))))

如果您还想要原型链中的属性,请参见 goog.object.getKeys - Derek Slager
我正在对js->clj函数的结果调用keys,根据文档,该函数将JavaScript对象转换为ClojureScript映射。为什么这样不起作用? - Odinodin
抱歉,这不是最好的答案。但是我研究了js->cljs函数和你的情况,找到了问题所在。我更新了答案。 - Viktor K.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接