如何在 ClojureScript 中列出 JavaScript 对象的属性和函数?
How to list the properties and functions of a JavaScript object in ClojureScript?
有没有一种简单的方法可以在 ClojureScript 中列出 JavaScript 对象的属性和功能?
我试过以下方法:
(keys (js->clj (.getContext canvas "2d")))
但这会引发以下错误:
ExceptionInfo #<Error: [object CanvasRenderingContext2D] is not ISeqable> clojure.core/ex-info (core.clj:4591)
您正在调用 keys clojure 函数,它是 (clojure) 映射的 returns 键。要 return 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 上下文。问题是 canvas 上下文不是标准的 js/Object 因此条件(相同?(类型 x)js/Object)不满足并且 js->clj 函数结束于else 分支,它使 js->clj 表现为恒等函数,这意味着它只是 return 传入的上下文。
这是源代码:
(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))))
我想出了一个办法。你可以打电话
(js-keys (.getContext canvas "2d"))
这将列出 JavaScript 对象的所有函数和属性。
有没有一种简单的方法可以在 ClojureScript 中列出 JavaScript 对象的属性和功能?
我试过以下方法:
(keys (js->clj (.getContext canvas "2d")))
但这会引发以下错误:
ExceptionInfo #<Error: [object CanvasRenderingContext2D] is not ISeqable> clojure.core/ex-info (core.clj:4591)
您正在调用 keys clojure 函数,它是 (clojure) 映射的 returns 键。要 return 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 上下文。问题是 canvas 上下文不是标准的 js/Object 因此条件(相同?(类型 x)js/Object)不满足并且 js->clj 函数结束于else 分支,它使 js->clj 表现为恒等函数,这意味着它只是 return 传入的上下文。
这是源代码:
(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))))
我想出了一个办法。你可以打电话
(js-keys (.getContext canvas "2d"))
这将列出 JavaScript 对象的所有函数和属性。