2011-08-09 23 views
45

Estoy escribiendo un servidor simple para Node.js y estoy usando mi propia clase llamada User que se parece a:Incluyendo definición de clase Javascript de otro archivo en 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)); 
    } 
}; 

y luego más tarde en el proceso que estoy instanciándola mucho:

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

¿Puedo mover mi definición User clase a otra Javascript archivo y "incluir" de alguna manera?

Respuesta

74

E incluso se puede simplemente hacer esto

user.js

class User { 
    //... 
}; 

module.exports = User; 

server.js

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

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

P.S. Y no uses globos globales. Crea conflictos potenciales en el futuro.

+0

que pasa si, el usuario tiene algunos parámetros de entrada, como module.exports = function User (data). Entonces el usuario var = new User(); ¿Debería haberse cambiado a var user = new User (data)? –

+0

Sí. 'User' es la función habitual de js. –

+2

finalmente, el secreto de los módulos se revela en pocas líneas !!!!! – holms

5

Modificar la definición de la clase para leer así:

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

cambie el nombre del archivo a user.js. Suponiendo que está en el directorio raíz de su script principal, se puede incluir la siguiente manera:

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

Esa es la versión rápida y sucia. Lea sobre CommonJS Modules si desea obtener más información.

+2

¿Qué le pasó a socket? debería ser var algún usuario = nuevo usuario.Usuario (socket); –

1

Si anexa a esta user.js:

exports.User = User; 

después en server.js que puede hacer:

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

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

Otra forma es:

global.User = User; 

entonces esto sería suficiente en server.js:

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

Usando ES6, puede tener user.js:

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

y luego usarlo en server.js

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

Otra forma, además de los proporcionados aquí para 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; 
    }  

} 

e incluir lo mismo que

var TEST= require('./TEST'); 
var test = new TEST(1); 
Cuestiones relacionadas