包括Node.js中另一个文件的JavaScript类定义

时间:2011-08-09 15:04:14

标签: javascript node.js

我正在为Node.js编写一个简单的服务器,我正在使用我自己的名为User的类,它看起来像:

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));
    }
};

然后在这个过程中我会实例化它:

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

我可以将User类定义移动到另一个javascript文件中并以某种方式“包含”它吗?

7 个答案:

答案 0 :(得分:146)

即使你可以做到这一点

<强> user.js的

class User {
    //...
};

module.exports = User;

<强> server.js

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

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

P.S。并且不要使用全局变量。它会在未来产生潜在的冲突。

答案 1 :(得分:12)

使用ES6,您可以拥有user.js

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

然后在server.js

中使用它
const User = require('./user.js').default;
const user = new User();

答案 2 :(得分:6)

修改您的类定义,使其如下所示:

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

然后将文件重命名为user.js。假设它位于主脚本的根目录中,您可以像这样包含它:

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

这是快速而肮脏的版本。如果您想了解更多信息,请阅读CommonJS Modules

答案 3 :(得分:5)

除此处为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;
    }    

}

并包含与

相同的内容
var TEST= require('./TEST');
var test = new TEST(1);

答案 4 :(得分:1)

如果您将此附加到user.js

exports.User = User;

然后在server.js你可以做到:

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

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

另一种方式是:

global.User = User;

那么这在server.js

就足够了
require('./user.js');

答案 5 :(得分:0)

编写myFile.mjs之类的文件,而不是myFile.js。该扩展附带了es6的所有功能,但我的意思是我向您推荐webpack和Babel

答案 6 :(得分:0)

我只是想指出,这里的大多数答案都行不通,如果在整个时间里“ module.exports.yourClass”方法发生更改,或者如果人们输入了错误的答案,我对NodeJS和IDK都是陌生的。

// MyClass

module.exports.Ninja = class Ninja{
    test(){
        console.log('TESTING 1... 2... 3...');
    };
}
//Using MyClass in seprate File


const ninjaFw = require('./NinjaFw');

let ninja = new ninjaFw.Ninja();
ninja.test();

  • 这是我当前正在使用的方法。我喜欢这种语法,因为module.exports与类声明位于同一行,因此可以将代码清理一些imo。您可以执行的另一种方式是这样的:
//  Ninja Framework File


class Ninja{
    test(){
        console.log('TESTING 1... 2... 3...');
    };
}


module.exports.Ninja = Ninja;

  • 两种不同的语法,但最终得到相同的结果。只是语法麻醉的问题。