运行CoffeeScript时,Firefox中的“ TypeError:非法构造函数”

时间:2019-07-09 14:11:47

标签: firefox coffeescript

运行此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。

1 个答案:

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

};