3

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

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()中给出了“未定义不是函数”,尽管 JS 版本模拟得很好。

4

5 回答 5

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

解决问题。

加法: 这个答案提到了javascript中对象构造的算法

于 2011-10-16T22:45:38.787 回答
2

CoffeeScript 的隐式返回与new. 正如其他人指出的那样,您可以使用显式返回。另一种选择是使用class,它创建一个constructor没有隐式返回的函数( ):

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

当然,在这种情况下,它的可读性不是很高,但作为一般规则,class无论何时使用new.

于 2011-10-16T22:48:29.063 回答
0

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

JS小提琴

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());
于 2011-10-16T22:48:23.523 回答
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() 作为方法的函数。

于 2011-10-16T22:49:38.267 回答
-2

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

于 2011-10-16T22:39:55.297 回答