clj) 我显然无法在处理函数中对特定对象 goog.events.Br-6ren">
gpt4 book ai didi

clojure - 为什么我不能在 js->clj 生成的序列中调用 seq 函数?

转载 作者:行者123 更新时间:2023-12-01 11:45:07 24 4
gpt4 key购买 nike

虽然我可以将一个简单的 js 对象变成一个 clojure 对象,例如;

(-> "{a: 2, b: 3}" js* js->clj)

我显然无法在处理函数中对特定对象 goog.events.BrowserEvent 执行此操作,例如:

(defn handle-click [e]
...
(-> e .-evt js->clj keys) ;; <-------------
...

虽然我可以使用 aget< 获取项目,但该函数确实得到应用,但生成的对象不响应序列函数,如 countfirst/。我在 chrome 的控制台中收到的错误消息是;

Uncaught Error: No protocol
method ISeqable.-seq defined for type object: [object Object]

为什么会这样? js->clj 不应该适用于所有对象吗?

我该如何解决这个问题?

谢谢!

最佳答案

js->clj 只改变了一个 JavaScript 对象(它是使用 instance? 而不是 isa? 实现的,并且有充分的理由),当您传递 js\Object 的后代时,js->clj 返回相同的对象。 aget(和 aset)之所以有效,是因为它在 JavaScript 上编译为 object[field-name] 语法。

您可以将 ISeq 协议(protocol)(或任何其他协议(protocol))扩展到 goog.events.BrowserEvent 以及所有适用于 ISeq 的函数将与 goog.events.BrowserEvent 一起使用。有一个 talk作者 Chris Houser,他展示了如何将一堆协议(protocol)扩展到 goog map 。我建议观看整个演讲,但与您的问题相关的部分大约从 14 分钟开始。

关于clojure - 为什么我不能在 js->clj 生成的序列中调用 seq 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16044897/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com