2011-08-09 25 views
45

Tôi đang viết một máy chủ đơn giản cho Node.js và tôi đang sử dụng lớp riêng tôi gọi User trông giống như:Bao gồm định nghĩa lớp Javascript từ một tập tin trong Node.js

function User(socket) { 
    this.socket = socket; 
    this.nickname = null; 

    /* ... just the typical source code like functions, variables and bugs ... */ 

    this.write = function(object) { 
     this.socket.write(JSON.stringify(object)); 
    } 
}; 

và sau đó trong quá trình tôi đang thực hiện nó rất nhiều:

var server = net.createServer(function (socket) { 
    /* other bugs */ 
    var user = new User(socket); 
    /* more bugs and bad practise */ 
}); 

Tôi có thể di chuyển định dạng lớp học của mình sang một tệp javascript khác và "bao gồm" bằng cách nào đó không?

Trả lời

74

Và thậm chí bạn chỉ có thể làm được điều này

user.js

class User { 
    //... 
}; 

module.exports = User; 

server.js

const User = require('./user.js'); 

// Instantiate User: 
let user = new User(); 

P.S. Và đừng dùng globals. Nó tạo ra xung đột tiềm năng trong tương lai.

+0

nếu như, Người dùng có một số thông số đầu vào, như module.exports = function User (data). Sau đó, var user = new User(); whould đã được thay đổi thành var user = new User (data) ;? –

+0

Có. 'User' là hàm js bình thường. –

+2

cuối cùng, bí mật của các mô-đun tiết lộ trong vài dòng !!!!! – holms

5

Sửa đổi định nghĩa lớp của bạn để đọc như thế này:

exports.User = function (socket) { 
    ... 
}; 

Sau đó đổi tên file để user.js. Giả sử nó nằm trong thư mục gốc của tập lệnh chính của bạn, bạn có thể bao gồm nó như sau:

var user = require('./user'); 
var someUser = new user.User(); 

Đó là phiên bản nhanh và bẩn. Đọc về CommonJS Modules nếu bạn muốn tìm hiểu thêm.

+2

Điều gì đã xảy ra với socket? nó nên được var someUser = new user.User (socket); –

1

Nếu bạn nối này để user.js:

exports.User = User; 

sau đó trong server.js bạn có thể làm:

var userFile = require('./user.js'); 
var User = userFile.User; 

http://nodejs.org/docs/v0.4.10/api/globals.html#require

Một cách khác là:

global.User = User; 

thì đây sẽ là đủ trong server.js:

require('./user.js'); 
3

Sử dụng ES6, bạn có thể có user.js:

export default class User { 
    constructor() { 
    ... 
    } 
} 

Và sau đó sử dụng nó trong server.js

const User = require('./user.js').default; 
const user = new User(); 
4

Một cách khác ngoài những người cung cấp ở đây cho ES6

module.exports = class TEST{ 
    constructor(size) { 
     this.map = new MAp(); 
     this.size = size; 

    } 

    get(key) { 
     return this.map.get(key); 
    } 

    length() { 
     return this.map.size; 
    }  

} 

và bao gồm giống như

var TEST= require('./TEST'); 
var test = new TEST(1); 
Các vấn đề liên quan