所以,我是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")
时,我会看到日志。
任何帮助都将不胜感激。
答案 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作为对象