2013-01-13 14 views
10

Mam moduł, który wygląda tak:NodeJS Moduł eksportu/prototyp - nie ma sposobu

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 

}; 

Jednak kiedy używać go tak:

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

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

pojawia się następujący błąd:

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' 

wydaje się, mam coś nie tak z moim MyModule.prototype.put?

+2

I nie jestem pewna, dlaczego ktoś mógłby zgodzić się z tym pytaniem bez ważnego powodu. Zrozumienie systemu modułów CommonJS jest bardzo ważną częścią pisania kodu node.js. Nawet jeśli rozumiesz tę koncepcję, ale przypadkowo ją przeoczyłeś ... to nadal jest poprawne pytanie. –

Odpowiedz

12

Napisałeś:

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

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

Tutaj myModule jest w rzeczywistości MyModule, funkcji konstruktora. A więc to, co robisz, to MyModule.put(), połączenie z "statyczną" metodą MyModule. MyModule.prototype.put definiuje "instancji" metodę więc trzeba instanciate pierwszy:

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

var myModule = new MyModule(); 
// or as you used `if (!(this instanceof MyModule)) { … }` 
var myModule = MyModule(); 

myModule.put({}, function() {}); 

Więc w zasadzie kod potrzebuje zaledwie parę () pracować:

MyModule().put({}, function() {}); 
// same as 
(new MyModule).put({}, function() {}); 

podsumować:

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

ale miałem instancję z "nowym", nadal nie mogę uzyskać funkcji prototypu po module module.exports http://stackoverflow.com/questions/33996343/miss-prototype-functions-when-new-a-instance?noredirect=1 # comment55752964_33996343 –

4

Tym kodem var myModule = require('myModule.js'); zmienna myModule wygląda jak funkcja konstruktora, a nie instancja myModule.

Spróbuj uruchamianiu modułu pierwszy:

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

// Now use it. 
myModule.put(/*... your code here ...*/); 
Powiązane problemy