Экспорт/прототип модуля 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
?
Ответы
Ответ 1
Вы писали:
var myModule = require('myModule.js');
myModule.put({}, function(){
//some callback stuff
});
Здесь myModule
есть фактически myModule
, функция-конструктор. Итак, вы делаете MyModule.put()
, вызов метода "static" 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();
Ответ 2
С помощью этого кода 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 ...*/);