我有一个模块,如下所示:
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) {
06002
看来我的MyModule.prototype.put有问题吗?
解决方法
你写了 :
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 () {});
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();