我在尝试让我的类在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。自从调用构造函数以来,这是有意义的,但是即使我还没有调用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)

最佳答案

首先是第一件事:您不需要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 key ,所以现在Mic.coffee中的exports如下所示:
{ Mic: ...your class... }

当您说require './Mic'时,您将获得该对象。换句话说:
require('./Mic') == { Mic: ...your class... }

因此,您需要执行以下操作之一:
  • Mic导出为Mic.coffee的整个导出,而不是作为键:
    module.exports = Mic
    
  • 取出整个模块,然后在其中实例化Mic对象:
    mic = require './Mic'
    m = new mic.Mic 3
    
  • 只需从Mic'd模块中取出require即可:
    {Mic} = require './Mic'  # equivalent to saying Mic = require('./Mic').Mic
    m = new Mic 3
    
  • 10-08 18:16