如何使用CoffeeScript模拟现有代码?

时间:2011-10-16 22:30:54

标签: javascript coffeescript markdowndeep

我想模仿MarkdownDeep,我在JavaScript中有以下代码

MarkdownDeep = new (function () {
    this.Markdown = function () {
        this.Transform = function (a) {
            return "html";
        };
    };
})();

但我在CoffeeScript中实现它时遇到了麻烦

我尝试了以下

MarkdownDeep = new (->
  @Markdown = ->
    @Transform = (a) ->
      "html"
)()
window.MarkdownDeep = MarkdownDeep

但是它不起作用,特别是在我的单元测试中markdown = new MarkdownDeep.Markdown()给出“undefined不是函数”,尽管JS版本模拟得很好。

5 个答案:

答案 0 :(得分:3)

您的示例会产生以下javascript代码:

var MarkdownDeep;
MarkdownDeep = new (function() {
  return this.Markdown = function() {
    return this.Transform = function(a) {
      return "html";
    };
  };
});
window.MarkdownDeep = MarkdownDeep;

return this.Markdown = function() { /* ... */ }使函数成为new运算符返回的对象。

书写

MarkdownDeep = new (->
  @Markdown = ->
    @Transform = (a) ->
      "html"
    return
  return
)
window.MarkdownDeep = MarkdownDeep

解决了这个问题。

<强>增加: This answer提到了javascript中对象构造的算法

答案 1 :(得分:2)

当与new结合使用时,CoffeeScript的隐式返回可能会导致混乱。正如其他人指出的那样,你可以使用显式回报。另一种选择是使用class,它创建一个没有隐式返回的函数(constructor):

MarkdownDeep = new class
  constructor: ->
    @Markdown = class
      constructor: ->
        @Transform = (a) ->
          'html'

当然,在这种情况下,这不是很易读,但作为一般规则,只要您使用class,就可以使用new来避免头痛。

答案 2 :(得分:0)

您需要为对象/类显式设置返回值,否则在创建新实例时它将返回成员函数。

JS FIDDLE

MarkdownDeep = new (->
  @Markdown = ->
    @Transform = (a) ->
      "html"
    undefined #return undefined instead of this.Transform
  undefined #return undefined instead of this.Markdown
)

markdown = new MarkdownDeep.Markdown()
alert markdown.Transform()

汇编为:

var MarkdownDeep, markdown;
MarkdownDeep = new (function() {
  this.Markdown = function() {
    this.Transform = function(a) {
      return "html";
    };
    return;
  };
  return;
});
markdown = new MarkdownDeep.Markdown();
alert(markdown.Transform());

答案 3 :(得分:0)

这就是Coffeescript作为输出提供的内容

var MarkdownDeep;
MarkdownDeep = new (function() {
  return this.Markdown = function() {
    return this.Transform = function(a) {
      return "html";
    };
  };
});

在Coffeescript中隐式返回每个函数的最后一行。在控制台中检查这一点会产生MarkdownDeep为

function () {
    return this.Transform = function(a) {
        return "html";
    };
}

返回一个没有Markdown()作为方法的函数。

答案 4 :(得分:-2)

CoffeeScript会自动将每个输出文件包装在匿名函数((function() { ... })())中。要禁用此功能,请在运行--bare时使用-bcoffee选项。