导出deftype方法

时间:2013-11-25 10:32:51

标签: javascript clojure google-closure-compiler clojurescript

我正在尝试在javascript中创建对象并调用方法。方法名称是munged。我没有运气就试过使用externs.js。

(deftype ^:export SceneMain []
  Object
  (handleShow [_]
    (display-categories)))

;; should be used in javascript as:

var s = new SceneMain();
s.handleShow();

;; Uncaught TypeError: Object [object Object] has no method 'handleShow'
;; Uncaught TypeError: Object #<dg> has no method 'handleShow'

这是我的externs.js

var SceneMain = {};
SceneMain.handleShow = function() {};

2 个答案:

答案 0 :(得分:4)

不完全确定你想要在那里完成什么。

externs.js在您使用Clojurescript的外部javascript库时非常有用,它不是使用Google的Closure编译器编译的,主要原因是当使用超过空格的优化时,编译器不会破坏外部库。< / p>

MixPanel Javascript api为例。

假设您使用该api具有以下cljs代码:

(defn track 
   ([name data]
      (.track js/mixpanel name 
             (clj->js data)))
   ([name]
      (.track js/mixpanel name)))

您需要在externs.js

中进行定义
 var mixpanel = {};
 mixpanel.track = function() {};

避免Closure编译器修改对该对象/函数的调用。

现在,如果您想从Javascript调用Clojurescript函数,则使用^:export即可。

说你有:

(ns test.cljs)

(defn ^:export testfn
   []
   (.log js/console "test"))

从你做的javascript:

 test.cljs.testfn()

答案 1 :(得分:1)

我使用exportSymbol:

(goog/exportSymbol "SceneMain" SceneMain)
(goog/exportSymbol "SceneMain.prototype.handleShow" SceneMain.prototype.handleShow)

即使使用高级优化也能正常工作:

ca("SceneMain",mg);
ca("SceneMain.prototype.handleShow",SceneMain.prototype.Cb);