javascript - 如何使用 ^ :export, 标记使用 `reify` 创建的方法,以便 Closure 编译器不重命名它们?

标签 javascript clojure clojurescript google-closure

当使用 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/

相关文章:

javascript - Django 将数据发送到模板中的 Javascript

clojure - 设置位置(x、y、基本方向)并允许在 clojure 中更新

javascript - 将 Clojurescript 线程优先宏与 Javascript Interop 结合使用

javascript - 在 Google 表格中跨行添加数字

javascript - 阻止浏览器(Chrome)运行默认功能,例如按空格滚动

java - 使用 incanter 从 clojure 中的数组获取均值和协方差矩阵

clojure - 访问 Compojure 查询字符串

clojurescript - Om/Next 中的规范化和标识

vim - 如何将 fireplace.vim 连接到浏览器 repl

javascript - 如何将输入文本字段中输入的值存储在数据库中