【发布时间】:2014-04-04 14:19:00
【问题描述】:
这将是我在 stackoverflow 上的第一个问题,希望一切顺利。 我一直在开发一个游戏(使用 corona SDK),我使用 Node.js 编写了一个小型服务器来处理我的客户端之间的一些聊天消息,那里没有问题。 现在我正在努力扩展这个小服务器来做更多的事情,我想做的是创建一个外部文件(模块),它将保存一个对象,该对象具有代表房间所需的所有函数和变量我的游戏“大厅”,两个人可以进入其中对战,每次我有两个玩家准备玩时,我都会为他们创建这个空房间的副本,然后在那个房间初始化游戏. 所以我在我的主项目文件中有一个数组,每个单元格都是一个房间,我的计划是将我的模块导入到那个数组中,然后我可以在那个特定的“房间”中初始化游戏,玩家会玩,游戏会继续进行,一切都会好起来的……但是……我在 main.js 中的代码:
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...
给出相同的结果,在我制作的所有“副本”中,它都是同一模块的相同实例。 所以我的问题就这么简单,我如何创建原始模块的“干净”副本,而不是一遍又一遍地实例化它,最终实际上只有一个凌乱的房间?
【问题讨论】:
标签: javascript node.js object module instance