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

Jak*_*old 5 javascript clojure google-closure clojurescript

使用时创建JavaScript对象时reify,如何标记方法,^:export以便Google Closure编译器不会在高级模式下重命名它们?

例如:

(reify
   Object
   (foo [this] ...)
   (bar [this] ...))
Run Code Online (Sandbox Code Playgroud)

我试过了

(reify
   Object
   (^:export foo [this] ...)
   (^:export bar [this] ...))
Run Code Online (Sandbox Code Playgroud)

但这似乎没有帮助,并且名称仍然会随着高级优化而改变.

如果没有办法做到这一点,我怎么能用方法构建一个JavaScript对象,除了创建一个普通的js-obj并使用set!设置属性的函数(我不知道如何防止高级优化破坏事物) ?

Pio*_*dyl 6

您必须提供^:export协议方法,因为您将在JS中调用它们,而不是直接从您的实现对象中调用方法.

(ns example.core)

(defprotocol MyProtocol
  (^:export foo [this])

(defn ^:export create []
  (reify
    MyProtocol
    (foo [this] "bar")))
Run Code Online (Sandbox Code Playgroud)

然后你可以在JS中使用它:

var a = example.core.create();
var b = example.core.foo(a);
// b = "bar"
Run Code Online (Sandbox Code Playgroud)

我用当前的cljs.jar尝试了它,它发出了原始foo名称的优化JS .