我在尝试让我的班级在我的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)
答案 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... }
因此您需要执行以下操作之一:
导出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