10

次のようなモジュールがあります。

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?に何か問題があるようです。

4

2 に答える 2

12

あなたが書いた :

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

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

これmyModuleが実際MyModuleにはコンストラクター関数です。つまり、あなたがしているのはMyModule.put()、の「静的」メソッドの呼び出しですMyModuleMyModule.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 () {});

したがって、基本的に、コードが機能するために必要なのは1組だけです()

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();
于 2013-01-13T10:45:03.540 に答える
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 ...*/);
于 2013-01-13T03:49:34.577 に答える