2015-05-01 14 views
5

Quando si creano oggetti JavaScript con reify, come posso contrassegnare i metodi con ^:export in modo che il compilatore Google Closure non li rinomini in modalità avanzata?Come posso contrassegnare i metodi creati con `reify` con ^: export, in modo che il compilatore Closure non li rinomini?

Ad esempio:

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

ho provato

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

ma questo non sembra aiutare, ei nomi ancora cambiarsi con le ottimizzazioni avanzate.

Se non c'è un modo per fare questo, come posso costruire un oggetto JavaScript con i metodi, altro che creare una pianura js-obj e utilizzando set! per impostare le funzioni di proprietà (dove io non sono sicuro di come prevenire avanzata ottimizzazioni da rompere le cose)?

risposta

6

È necessario fornire ^:export sui metodi del protocollo come li chiameremo in JS, non direttamente dai metodi dell'oggetto reificato.

(ns example.core) 

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

(defn ^:export create [] 
    (reify 
    MyProtocol 
    (foo [this] "bar"))) 

Quindi è possibile utilizzare da JS:

var a = example.core.create(); 
var b = example.core.foo(a); 
// b = "bar" 

ho provato con la corrente cljs.jar ed emessa ottimizzata JS con originali foo nome.