我想模仿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版本模拟得很好。
答案 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)
您需要为对象/类显式设置返回值,否则在创建新实例时它将返回成员函数。
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
时使用-b
或coffee
选项。