2013-01-13 35 views
10

我有一个模块,看起来像这样:模块的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: Object 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]; 
} } has no method 'put' 

看来我有我的MyModule.prototype.put出问题了吗?

+2

我我不确定为什么有人会无缘无故地低估这个问题。理解CommonJS模块系统是编写node.js代码非常重要的部分。即使你了解这个概念,但却意外地忽略了它......这仍然是一个有效的问题。 –

回答

12

您写道:

var myModule = require('myModule.js'); 

myModule.put({}, function(){ 
    //some callback stuff 
}); 

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

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() {}); 

回顾:

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(); 
+0

但我有实例与“新”的,之后我module.exports http://stackoverflow.com/questions/33996343/miss-prototype-functions-when-new-a-instance?noredirect=1仍然无法拿到的样机功能#comment55752964_33996343 –

4

使用此代码var myModule = require('myModule.js');您的myModule变量看起来像一个构造函数,而不是myModule的一个实例。

首先尝试实例化的组件:

var MyModule = require('myModule.js');  
var myModule = new MyModule(); // Create an instance of your module. 

// Now use it. 
myModule.put(/*... your code here ...*/); 
相关问题