2015-05-01 42 views
5

使用reify創建JavaScript對象時,如何使用^:export標記方法,以便Google Closure編譯器不會在高級模式下重命名它們?如何使用^:export標記用`reify`創建的方法,以便Closure編譯器不重命名它們?

例如:

(reify 
    Object 
    (foo [this] ...) 
    (bar [this] ...)) 

我已經試過

(reify 
    Object 
    (^:export foo [this] ...) 
    (^:export bar [this] ...)) 

但這似乎並沒有幫助,而且名字仍然可以憑藉先進的優化改變。

如果沒有辦法做到這一點,我怎樣才能構建一個JavaScript對象的方法,除了創建一個普通的js-obj和使用set!設置功能屬性(我不知道如何防止高級破壞事物的優化)?

回答

6

你必須在你的協議方法上提供^: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嘗試過了,它發出的優化JS與原foo名。

相關問題