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');
你的myModule
variables看起来像一个构造函数,而不是myModule的一个实例。
尝试首先实例化你的模块:
var MyModule = require('myModule.js'); var myModule = new MyModule(); // Create an instance of your module. // Now use it. myModule.put(/*... your code here ...*/);