6

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

IE

class Mic

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

exports.Mic = Mic

这是我的 app.coffee 文件

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

当我运行 app.coffee 时,它​​会给出一个异常 ReferenceError: x is not defined。这是有道理的,因为它调用了构造函数,但是为什么即使我没有调用 new 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)
4

1 回答 1

17

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

其次,第一个文件出现缩进错误;如果您希望它成为Mic的构造函数,请将其缩进到 下一级class,即:

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

exports.Mic = Mic

最后,问题是这exports是一个出口对象。看这里:

exports.Mic = Mic

您已分配Micexports对象的Mic键,所以现在exports在 Mic.coffee 中看起来像这样:

{ 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. 只需Micrequire'd 模块中取出:

    {Mic} = require './Mic'  # equivalent to saying Mic = require('./Mic').Mic
    m = new Mic 3
    
于 2012-05-27T06:36:33.620 回答