【问题标题】:Export deftype methods导出 deftype 方法
【发布时间】:2013-11-25 10:32:50
【问题描述】:

我正在尝试在 javascript 中创建对象并调用方法。方法名称已修改。我尝试使用 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() {};

【问题讨论】:

    标签: javascript clojure google-closure-compiler clojurescript


    【解决方案1】:

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

    externs.js 在您使用来自 Clojurescript 的外部 javascript 库时很有用,该库未使用 Google 的 Closure 编译器编译,主要原因是当使用超出空格的优化时,编译器不会破坏外部库。

    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() {};
    

    为了避免闭包编译器破坏对该对象/函数的调用。

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

    假设你有:

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

    从 javascript 你做:

     test.cljs.testfn()
    

    【讨论】:

    【解决方案2】:

    我使用 exportSymbol:

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

    它甚至可以使用高级优化:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-29
      • 2011-06-16
      • 1970-01-01
      • 1970-01-01
      • 2021-07-18
      相关资源
      最近更新 更多