我遇到Node.js和module.exports
.我理解这module.exports
是一个返回一个对象的调用,该对象具有分配的任何属性.
如果我有这样的文件结构:
// formatting.js function Format(text) { this.text = text; } module.exports = Format;
有了这个:
// index.js var formatting = require('./formatting');
有没有办法初始化一个Format
对象并像这样使用它?
formatting('foo'); console.log(formatting.text);
每当我尝试这样做时,我都会收到错误消息formatting is not a function
.然后,我必须这样做:
var x = new formatting('foo'); console.log(x.text);
这似乎很麻烦.
在像keypress
和的模块中request
,它们可以在门外使用,如下所示:
var keypress = require('keypress'); keypress(std.in);
要么
var request = require('request); request('http://www.google.com', function (error, response, body) { if (!error && response.statusCode == 200) { console.log(body) // Show the HTML for the Google homepage. } })
这是如何运作的?
我建议将new
调用包装在它自己的函数中然后返回:
function Format(text) { this.text = text; } function formatting(text) { return new Format(text); } module.exports = formatting;
这样你仍然可以这样做:
var format = formatting('foo'); console.log(format.text);
编辑:
就这些request
东西而言,你要记住的一件事是,在JavaScript中,函数仍然是对象.这意味着您仍然可以向它们添加属性和方法.这就是他们正在做的事情,request
尽管总体来说这个解释每个细节都有点太复杂了.据我所知,他们在函数中添加了一堆方法(对象上的request
函数).这就是为什么你可以立即调用那些方法,比如request(blah, blah).pipe(blah).on(blah)
基于调用request
函数返回的内容,你可以在其背面链接一些其他方法.当你使用请求它不是一个对象时,它是一个函数(但在技术上仍然是一个对象).要演示函数是如何仍然是对象以及如何向它们添加方法,请查看这个简单的示例代码:
function hey(){ return; } hey.sayHello = function(name) { console.log('Hello ' + name); } hey.sayHello('John'); //=> Hello John
这基本上就是他们正在做的事情,只是更复杂,还有更多东西在继续.