类实例化

时间:2012-07-25 03:00:40

标签: node.js coffeescript

我按照这个示例:Coffeescript and node.js confusion. require instantiates class?,但它似乎不起作用 - 错误是TypeError: undefined is not a function,所以我一定做错了。我有一个简单的咖啡脚本可执行文件。以下是我的步骤:

创建文件夹结构:

appmq

  • my_executable

  • my_class.coffee

  • 的package.json

文件内容:

package.json

{
    "name": "appmq",
    "version": "0.0.1",
    "description": "xxxxxx",
    "repository": "",
    "author": "Frank LoVecchio",
    "dependencies": {
    },
    "bin": {"appmq": "./my_executable"}
}

my_executable

#!/usr/bin/env coffee
{CommandLineTools} = require './my_class'
cmdTools = new CommandLineTools()

cmdTools.debug()

my_class

class CommandLineTools

  debug: () ->
    console.log('Version: ' + process.version)
    console.log('Platform: ' + process.platform)
    console.log('Architecture: ' + process.arch)
    console.log('NODE_PATH: ' + process.env.NODE_PATH)

module.exports = CommandLineTools

然后我通过以下方式安装应用程序:

sudo npm install -g

然后我运行应用程序(产生我上面提到的错误):

appmq

2 个答案:

答案 0 :(得分:2)

克里斯的答案是正确的,但这与你班上是否有明确的构造函数无关,而是与你的导出内容有关。

如果要导出这样的单个类:

module.exports = CommandLineTools

然后,当您require时,返回的内容将是您在上面module.exports分配的内容,即:

CommandLineTools = require './my_class'

这将有效。您正在做的是以上述方式导出,但您正在使用CoffeeScript的destructuring assignment

{CommandLineTools} = require './my_class'

编译为js:

var CommandLineTools;
CommandLineTools = require('./my_class').CommandLineTools;

哪个失败,因为require调用会返回一个属性为CommandLineTools的对象,而是CommandLineTools本身。现在,如果你想使用上面的解构分配,你必须像这样导出CommandLineTools

exports.CommandLineTools = CommandLineTools

我希望这会对此事有所了解。否则,请在评论中提出要求!

答案 1 :(得分:1)

你班上没有构造函数。交换

{CommandLineTool} = require './my_class'

CommandLineTool = require './my_class'

或写一个(空)构造函数。