"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.`);
  }

};