NodeJS自定义模块未定义

时间:2016-01-08 07:34:15

标签: javascript node.js

所以,我是NodeJS的新手(两周前开始学习它),我决定深入研究创建自己模块的领域。我查了一些文章,发现使用构造函数创建模块的最佳方法如下:

var Foo = function (params) {
    //Do constructor stuff
    this.params = params;
};

Foo.prototype.test = function () {
    console.log(this.params.Message);
};

module.exports = Foo;

然后我就可以做var myFoo = require("./utils/Foo.js")( { Message: "Some Message }); 这运行构造函数。但是,当我myFoo.test()时,我收到错误Cannot read property 'test' of undefined

我不明白为什么我收到上述错误。当我向构造函数添加console.log("Test")时,我会看到日志。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:1)

原型的方法需要使用new关键字。但是,当您需要它时,您不使用新关键字。

你有几个选择。您可以在需要时添加new关键字。 (顺便说一下,我把两者分开,因为我不完全确定new关键字会发生什么,如果是new require('module')()。我认为它适用于require调用,而不是函数调用之后)

var fooModule = require('./foo.js'),
    myFoo = new fooModule('myMessage');

或者您可以将该逻辑放在构造函数中,以便在省略new关键字时返回新版本;您的需求调用不会改变,但您的构造函数可能类似于:

var Foo = function (params) {
    if (!(this instanceof Foo)) {
        return new Foo(params);
    }
    //Do constructor stuff
    this.params = params;
};

请参阅小提琴示例:https://jsfiddle.net/84ssgare/1/

一般来说,无论如何我都会避免使用新的关键字。它试图让JavaScript成为现实。这个article列出了new关键字如何工作的一些很好的示例。它也是一个好点,它是一个工具,应该在需要时使用,而不是因为它熟悉。

答案 1 :(得分:0)

你需要new来从构造函数创建对象:

var foo=require("./utils/Foo.js");
var myFoo = new foo( { Message: "Some Message });

简短版本:

var myFoo = new require("./utils/Foo.js")( { Message: "Some Message });

在您的实际代码中,您正在执行重新运行undefined的foo函数。然后尝试使用测试属性

访问undefined作为对象