Coffeescript和node.js混淆。 require实例化类?

时间:2012-05-27 06:30:15

标签: node.js coffeescript

我在尝试让我的班级在我的node.js文件中工作时遇到了麻烦。当我需要我写的模块时,require'./module'调用我的构造函数并给出错误。但我实际上想稍后在文件中实例化。

class Mic

constructor: (x) ->
  @t = []
  @t.push x

exports.Mic = Mic

这是我的app.coffee文件

require 'coffee-script'
require './Mic'

当我运行app.coffee时,它会给出一个异常ReferenceError:x未定义。这是有意义的,因为它调用构造函数,但为什么它调用构造函数,即使我没有调用新的Mic?

修改 修复缩进后

class Mic
    constructor: (x) ->
        @t = []
        @t.push x

exports.Mic = Mic

并将我的app.coffee更新为

Mic = require './Mic'

m = new Mic 3
console.log m

我收到错误

TypeError: object is not a function
    at Object.CALL_NON_FUNCTION_AS_CONSTRUCTOR (native)

1 个答案:

答案 0 :(得分:17)

第一件事是第一件事:你不需要require 'coffee-script' - 用coffee运行就足够了;与运行编译的JavaScript相同。您不需要在程序中运行时提供CoffeeScript库。

其次,第一个文件缩进不正确;如果你希望它是Mic的构造函数,在class下面缩进一级,即:

class Mic
  constructor: (x) ->
    @t = []
    @t.push x

exports.Mic = Mic

最后,问题是exports对象的导出。见这里:

exports.Mic = Mic

您已将Mic分配给exports对象的Mic密钥,因此现在Mic.coffee中的exports如下所示:

{ Mic: ...your class... }

当你说require './Mic'时,你会得到那个对象;换句话说:

require('./Mic') == { Mic: ...your class... }

因此您需要执行以下操作之一:

  1. 导出Mic作为Mic.coffee的整个导出,而不是关键:

    module.exports = Mic
    
  2. 取出整个模块,然后实例化Mic对象:

    mic = require './Mic'
    m = new mic.Mic 3
    
  3. Mic'd模块中取出require

    {Mic} = require './Mic'  # equivalent to saying Mic = require('./Mic').Mic
    m = new Mic 3