当使用 reify
创建 JavaScript 对象时,如何使用 ^:export
标记方法,以便 Google Closure 编译器不会在高级模式下重命名它们?
例如:
(reify
Object
(foo [this] ...)
(bar [this] ...))
我试过了
(reify
Object
(^:export foo [this] ...)
(^:export bar [this] ...))
但这似乎没有帮助,并且名称仍然会随着高级优化而改变。
如果没有办法做到这一点,除了创建一个普通的 js-obj
并使用 set!
之外,我该如何使用方法构造一个 JavaScript 对象将函数设置为属性(我不确定如何防止高级优化破坏事物)?
最佳答案
您必须在您的协议(protocol)方法上提供 ^:export
,因为您将在 JS 中调用它们,而不是直接从具体化对象中调用它们。
(ns example.core)
(defprotocol MyProtocol
(^:export foo [this])
(defn ^:export create []
(reify
MyProtocol
(foo [this] "bar")))
然后你可以在 JS 中使用它:
var a = example.core.create();
var b = example.core.foo(a);
// b = "bar"
我用当前的 cljs.jar 试过了并发出带有原始 foo
名称的优化 JS。
关于javascript - 如何使用 ^ :export, 标记使用 `reify` 创建的方法,以便 Closure 编译器不重命名它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29995440/