在Node.js中创建模块的副本而不是实例

尤瓦尔

这将是我关于stackoverflow的第一个问题,希望一切顺利。我一直在开发游戏(使用corona SDK),并且我使用Node.js编写了一个小型服务器来处理客户端之间的一些聊天消息,在那里没有问题。现在,我正在努力扩展这台小型服务器,以执行更多操作,而我想做的是创建一个外部文件(模块),该文件将容纳一个对象,该对象具有表示我在其中的Room所需的所有功能和变量。我的游戏“大厅”中,两个人可以进场比赛,每当我有2个球员准备比赛时,我会为他们创建一个空房间的副本,然后在该房间中初始化游戏。所以我在主项目文件中有一个数组,其中每个单元格都是一个房间,我的计划是将模块导入到该数组中,

var new_game_obj = require('./room.js');

games[room_id] = new_game_obj();

games[room_id].users = [user1_name,user2_name];

现在,在我的room.js中,我有了一些类似的东西:

var game_logistics = {};

game_logistics.users = new Array();

game_logistics.return_users_count = function(){
    return game_logistics.users.length;
}

module.exports = function() {
    return game_logistics;
}

到目前为止,一切顺利,而且一切正常,我可以简单地进行以下操作:

games[room_id].return_users_count()

我将得到0或1或2,具体取决于加入该会议室的用户数量。一旦我打开一个新房间,问题就会开始,因为Node.js会实例化我创建的模块,而不是对其进行复制,即使现在我创建一个新房间,即使我删除和/或删除了旧房间,也是如此,它会包含我已经更新的旧房间中的所有信息,而不是新的洁净室中的所有信息。例子:

var new_game_obj = require('./room.js');

games["room_1"] = new_game_obj();
games["room_2"] = new_game_obj();

games["room_1"].users = ["yuval","lahav"];

_log(games["room_1"].return_user_count()); //outputs 2...
_log(games["room_2"].return_user_count()); //outputs 2...

即使这样做:

var new_game_obj = require('./room.js');
games["room_1"] = new_game_obj();

var new_game_obj2 = require('./room.js');
games["room_2"] = new_game_obj2();

games["room_1"].users = ["yuval","lahav"];

_log(games["room_1"].return_user_count()); //outputs 2...
_log(games["room_2"].return_user_count()); //outputs 2...

给出相同的结果,它是我制作的所有“副本”中同一模块的所有相同实例。所以我的问题就这么简单,我如何创建原始模块的“干净”副本,而不是一遍又一遍地实例化它,实际上最后只有一个凌乱的房间?

马特

您正在执行的操作是(用require()返回的内容替换呼叫);

var new_game_obj = function() {
    return game_logistics;
}

因此,每次调用时new_game_obj,您都会返回的相同实例game_logistics

相反,您需要使new_game_objreturn成为新的实例game_logistics

// room.js
function Game_Logistics() {
    this.users = [];

    this.return_users_count = function(){
        return this.users.length;
    };
}

module.exports = function() {
    return new Game_Logistics(); 
}

这是一种观念上的转变。你会看到,我们使用newGame_Logisticsmodule.exports返回一个的实例Game_Logistics每次被称为时间。

您还可以看到里面Game_Logisticsthis正在使用无处不在,而不是Game_Logistics; 这是为了确保我们引用的是正确的实例Game_Logistics而不是构造函数。

我还大写了您的game_logistics函数,以遵循广泛遵循的命名约定,即构造函数应大写(更多信息)。

当您使用多个函数实例时,建议利用JavaScript中的原型链。您可以阅读有关“ JavaScript原型继承*(例如,这一篇”的各种文章,但是到目前为止,以上内容可以满足您的需要。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章