这将是我关于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_obj
return成为新的实例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();
}
这是一种观念上的转变。你会看到,我们使用new
上Game_Logistics
在module.exports
返回一个新的实例Game_Logistics
每次被称为时间。
您还可以看到里面Game_Logistics
,this
正在使用无处不在,而不是Game_Logistics
; 这是为了确保我们引用的是正确的实例,Game_Logistics
而不是构造函数。
我还大写了您的game_logistics
函数,以遵循广泛遵循的命名约定,即构造函数应大写(更多信息)。
当您使用多个函数实例时,建议利用JavaScript中的原型链。您可以阅读有关“ JavaScript原型继承*(例如,这一篇)”的各种文章,但是到目前为止,以上内容可以满足您的需要。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句