如何在ClojureScript中列出JavaScript对象的属性和功能?

Odi*_*din 7 clojurescript

有没有一种简单的方法可以在ClojureScript中列出JavaScript对象的属性和功能?

我尝试过以下方法:

(keys (js->clj (.getContext canvas "2d")))
Run Code Online (Sandbox Code Playgroud)

但是这会引发以下错误:

ExceptionInfo #<Error: [object CanvasRenderingContext2D] is not ISeqable>  clojure.core/ex-info (core.clj:4591)
Run Code Online (Sandbox Code Playgroud)

Odi*_*din 11

我想出了办法.你可以打电话

(js-keys (.getContext canvas "2d"))
Run Code Online (Sandbox Code Playgroud)

这将列出JavaScript对象的所有功能和属性.


Vik*_* K. 5

您正在调用 clojure函数,它返回(clojure)映射的键.要返回javascript对象的所有属性,您应该这样做:

(.keys js/Object myObject)
Run Code Online (Sandbox Code Playgroud)

这是javascript代码的类比:

Object.keys(myObject);
Run Code Online (Sandbox Code Playgroud)

编辑: 我只是查看了js-> clj的源代码 - https://github.com/clojure/clojurescript/blob/master/src/main/cljs/cljs/core.cljs,我也尝试使用canvas上下文.问题是canvas上下文不是标准的js/Object,因此条件(相同的?(类型x)js/Object)不满足,js-> clj函数最终在else分支中,这使得js- > clj表现为身份函数,这意味着它只是在传递它时返回上下文.

这是源代码:

(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))))
Run Code Online (Sandbox Code Playgroud)