2013-01-13 21 views
10

Tôi đã có một mô-đun đó trông như thế này:NodeJS Mô-đun xuất khẩu/mẫu - không có phương pháp

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 

}; 

Tuy nhiên, khi tôi sử dụng nó như thế này:

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

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

tôi nhận được như sau lỗi:

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' 

Dường như tôi có điều gì đó sai với MyModule.prototype.put?

+2

tôi 'không chắc chắn tại sao một người nào đó sẽ downvote câu hỏi này mà không có lý do chính đáng. Hiểu được hệ thống mô-đun CommonJS là một phần khá quan trọng để viết mã node.js. Ngay cả khi bạn hiểu khái niệm, nhưng vô tình bỏ qua nó ... nó vẫn là một câu hỏi hợp lệ. –

Trả lời

12

Bạn đã viết:

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

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

Đây myModule là trong thực tế MyModule, một hàm constructor. Vì vậy, những gì bạn đang làm là MyModule.put(), một cuộc gọi đến phương thức "tĩnh" là MyModule. MyModule.prototype.put định nghĩa một phương pháp "dụ" vì vậy bạn phải instanciate đầu tiên:

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

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

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

Vì vậy, về cơ bản mã của bạn cần chỉ là một cặp () làm việc:

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

recap:

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

nhưng tôi đã có ví dụ với "mới", vẫn không thể có được chức năng nguyên mẫu sau khi tôi module.exports http://stackoverflow.com/questions/33996343/miss-prototype-functions-when-new-a-instance?noredirect=1 # comment55752964_33996343 –

4

Với mã này var myModule = require('myModule.js'); biến số myModule của bạn trông giống như hàm hàm dựng, không phải là phiên bản của myModule.

Hãy thử instantiating module của bạn đầu tiên:

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

// Now use it. 
myModule.put(/*... your code here ...*/); 
Các vấn đề liên quan