NodeJS模块导出/原型 – 没有办法

我有一个看起来像这样的模块:

var MyModule = module.exports = function MyModule(opts) { opts = (opts === Object(opts)) ? opts : {}; if (!(this instanceof MyModule)) { return new MyModule(opts); } for (var key in opts) if ({}.hasOwnProperty.call(opts, key)) { this.config[key] == opts[key]; } }; MyModule.prototype.config = { something:'value' } MyModule.prototype.put = function put(info, cb) { //do stuff }; 

但是,当我这样使用它时:

 var myModule = require('myModule.js'); myModule.put({test}, function(){ //some callback stuff }); 

我得到以下错误:

TypeError:对象函数MyModule(opts){

 opts = (opts === Object(opts)) ? opts : {}; if (!(this instanceof MyModule)) { return new MyModule(opts); } for (var key in opts) if ({}.hasOwnProperty.call(opts, key)) { this.config[key] == opts[key]; } } has no method 'put' 

看来我的MyModule.prototype.put吗?

你写了 :

 var myModule = require('myModule.js'); myModule.put({}, function(){ //some callback stuff }); 

这里myModule实际上是一个构造函数MyModule 。 所以你在做什么是MyModule.put() ,一个MyModule.put()的“静态”方法的调用。 MyModule.prototype.put定义了一个“实例”的方法,所以你必须先instanciate:

 var MyModule = require('./myModule.js'); var myModule = new MyModule(); // or as you used `if (!(this instanceof MyModule)) { … }` var myModule = MyModule(); myModule.put({}, function () {}); 

所以基本上你的代码只需要一对()来工作:

 MyModule().put({}, function () {}); // same as (new MyModule).put({}, function () {}); 

Récap:

 var MyModule = function () { // Construct object }; MyModule.staticMethod = function () { this; // is bound to `MyModule` function object }; MyModule.prototype.instanceMethod = function () { this; // is bound to the `MyModule` instance object it's called from }; // Usage MyModule.staticMethod(); var instance = new MyModule(); instance.instanceMethod(); 

用这个代码var myModule = require('myModule.js'); 你的myModulevariables看起来像一个构造函数,而不是myModule的一个实例。

尝试首先实例化你的模块:

 var MyModule = require('myModule.js'); var myModule = new MyModule(); // Create an instance of your module. // Now use it. myModule.put(/*... your code here ...*/);