2011-08-09 9 views
45

Piszę prosty serwer dla node.js i używam moje własne klasy o nazwie User który wygląda tak:Łącznie Javascript definicji klasy z innego pliku w 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)); 
    } 
}; 

a później w proces mam instancji to dużo:

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

mogę przenieść moją definicję User klasy do innego pliku JavaScript i „obejmują” go jakoś?

Odpowiedz

74

I nawet można po prostu to zrobić

user.js

class User { 
    //... 
}; 

module.exports = User; 

server.js

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

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

P.S. I nie używaj globali. Tworzy potencjalne konflikty w przyszłości.

+0

co jeśli użytkownik miał pewne parametry wejściowe, takie jak module.exports = funkcja użytkownika (dane). Następnie użytkownik var = new User(); który mógł zostać zmieniony na var user = new User (data) ;? –

+0

Tak. 'Użytkownik' jest zwykłą funkcją js. –

+2

wreszcie, sekret modułów ujawnionych w kilku liniach !!!!! – holms

5

Modyfikowanie definicji klasy czytać tak:

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

następnie zmień nazwę pliku do user.js. Zakładając, że znajduje się on w głównym katalogu głównego skryptu, można go dołączyć w następujący sposób:

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

To szybka i brudna wersja. Przeczytaj o CommonJS Modules, jeśli chcesz dowiedzieć się więcej.

+2

Co stało się z gniazdem? powinien to być var ​​someUser = new user.User (socket); –

1

Jeśli dołączyć do tego user.js:

exports.User = User; 

następnie w server.js można zrobić:

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

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

Innym sposobem jest:

global.User = User; 

wtedy to byłoby na tyle w server.js:

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

Korzystanie ES6, można mieć user.js:

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

a następnie używać go w server.js

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

Innym sposobem oprócz tych dostarczonych tutaj 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; 
    }  

} 

i obejmują to samo, co

var TEST= require('./TEST'); 
var test = new TEST(1); 
Powiązane problemy