"TypeError: Illegal constructor" in Firefox when running CoffeeScript
"TypeError: Illegal constructor" in Firefox when running CoffeeScript
我在控制台日志中收到错误 "TypeError: Illegal constructor",当 运行 此 CoffeeScript 代码时:
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.
火狐 67.
您有一个小错字,导致错误地转译为 javascript。
constructor (@name) ->
应该是
constructor: (@name) ->
前者被解释为调用方法构造函数并将其传递给匿名函数(@name) ->
。这似乎混淆了 coffeescript,它将 class 定义包装在一个立即执行的匿名函数中,以创建一个闭包,从中使用 this
将名称分配给。
更正后,您的整个 class 应该编译成这样更清晰:
var Animal;
Animal = class Animal {
constructor(name) {
this.name = name;
}
move(meters) {
return alert(this.name + ` moved ${meters}m.`);
}
};
我在控制台日志中收到错误 "TypeError: Illegal constructor",当 运行 此 CoffeeScript 代码时:
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.
火狐 67.
您有一个小错字,导致错误地转译为 javascript。
constructor (@name) ->
应该是
constructor: (@name) ->
前者被解释为调用方法构造函数并将其传递给匿名函数(@name) ->
。这似乎混淆了 coffeescript,它将 class 定义包装在一个立即执行的匿名函数中,以创建一个闭包,从中使用 this
将名称分配给。
更正后,您的整个 class 应该编译成这样更清晰:
var Animal;
Animal = class Animal {
constructor(name) {
this.name = name;
}
move(meters) {
return alert(this.name + ` moved ${meters}m.`);
}
};