运行此CoffeeScript代码时,控制台日志中出现错误“ TypeError:非法构造函数”:
class Logger
constructor (@name) ->
log: (level, msg) ->
console.log(level, @name, msg)
debug: (msg) ->
log('DEBUG', msg)
new Logger('foo')
JavaScript:
Logger = (function() {
class Logger {
log(level, msg) {
return console.log(level, this.name, msg);
}
debug(msg) {
return log('DEBUG', msg);
}
info(msg) {
return log('INFO', msg);
}
};
constructor(function(name) { // <<--- Firefox throws TypeError here
this.name = name;
});
return Logger;
}).call(this);
相反,coffee
应该生成以下代码:
Logger = class Logger {
constructor(name) { // <<-- No function() here!
this.name = name;
}
log(level, msg) {
return console.log(level, this.name, msg);
}
debug(msg) {
return log('DEBUG', msg);
}
info(msg) {
return log('INFO', msg);
}
};
我该如何解决?
该示例可在Chrome 75中使用。
Firefox 67。
答案 0 :(得分:0)
您的输入错误,会导致错误地转换为javascript。
constructor (@name) ->
应该是
constructor: (@name) ->
前者被解释为调用方法构造函数并将其传递给匿名函数(@name) ->
。这似乎使咖啡脚本感到困惑,该脚本将类定义包装在立即执行的匿名函数中,以创建一个闭包,该闭包可使用this
来为其指定名称。
更正后,您的整个班级都应该对此进行编译:
var Animal;
Animal = class Animal {
constructor(name) {
this.name = name;
}
move(meters) {
return alert(this.name + ` moved ${meters}m.`);
}
};