Nodejs中类似对象和对象管理器的问题
Nodejs中类似对象和对象管理器的问题
想实现一个类似于java中的对象管理器,来管理“对象” player.js中代码如下
function player(aPlayerId,aPlayerIp)
{
mPlayerInfo=new Object();
mPlayerInfo.id=aPlayerId;
mPlayerInfo.ip=aPlayerIp;
}
player.prototype.GetPlayerInfo=function ()
{
return mPlayerInfo;
}
playermanager.js中代码如下
var mPlayerList=Array();
function AddPlayer(aId,aIp)
{
mPlayerList[aId]=new mPlayerObJ.player(aId,aIp);
}
function GetPlayerAll()
{
console.log(mPlayerList[1].GetPlayerInfo().id);
}
通过AddPlayer的方法添加了2个player但是添加第二个player的时候会将第一个添加的player里面的值覆盖,求各位高手帮着解决下,还是这样的思路就是不可以。
3 回复
当然可以。让我们一起来看看如何解决这个问题,并提供一个更合理的对象管理和实现方式。
问题分析
当前的实现中,mPlayerList
数组使用了aId
作为索引,但当添加第二个玩家时,它覆盖了第一个玩家的信息。这是因为JavaScript中的对象引用机制导致的。具体来说,mPlayerInfo
是一个静态对象,所有实例共享同一个对象引用,因此每次创建新实例时都会覆盖之前的数据。
解决方案
为了更好地管理玩家对象,我们可以采用以下方法:
- 使用唯一标识符:每个玩家应该有一个唯一的ID,而不是直接用ID作为数组的索引。
- 避免静态对象引用:确保每个玩家实例有自己的数据副本。
示例代码
player.js
function Player(playerId, playerIp) {
this.id = playerId;
this.ip = playerIp;
}
Player.prototype.getPlayerInfo = function() {
return {
id: this.id,
ip: this.ip
};
}
playermanager.js
const players = {};
function addPlayer(playerId, playerIp) {
if (!players[playerId]) {
players[playerId] = new Player(playerId, playerIp);
} else {
console.error(`Player with ID ${playerId} already exists.`);
}
}
function getPlayerAll() {
for (let playerId in players) {
console.log(players[playerId].getPlayerInfo());
}
}
// 测试代码
addPlayer(1, '192.168.1.1');
addPlayer(2, '192.168.1.2');
getPlayerAll();
解释
- Player构造函数:定义了一个
Player
构造函数,每个实例都有自己的id
和ip
属性。 - getPlayerInfo方法:返回当前玩家的信息对象,而不是引用同一个静态对象。
- playermanager.js:
players
对象使用玩家ID作为键来存储不同的玩家实例。addPlayer
函数检查是否已经存在该玩家ID,如果不存在则添加新的玩家实例。getPlayerAll
函数遍历所有玩家并打印它们的信息。
这样设计后,每个玩家都有独立的信息,不会互相覆盖。此外,这种方法也更容易扩展和维护。
额,已经解决了。在player.js中把playerinfo前面加上this 就好了-.-
根据你的描述,在Node.js中创建一个对象管理器以避免对象间的相互覆盖问题,可以通过使用一个对象而不是数组来存储玩家信息。这样可以确保每个玩家都有自己的唯一标识符作为键。下面是修改后的代码:
player.js
function Player(aPlayerId, aPlayerIp) {
this.id = aPlayerId;
this.ip = aPlayerIp;
}
Player.prototype.GetPlayerInfo = function () {
return {
id: this.id,
ip: this.ip
};
};
playermanager.js
const Player = require('./player');
var mPlayerList = {};
function AddPlayer(aId, aIp) {
if (!mPlayerList[aId]) {
mPlayerList[aId] = new Player(aId, aIp);
} else {
console.log("Player with ID " + aId + " already exists.");
}
}
function GetPlayerById(aId) {
if (mPlayerList[aId]) {
return mPlayerList[aId].GetPlayerInfo();
} else {
console.log("Player with ID " + aId + " does not exist.");
}
}
// 示例使用
AddPlayer(1, '192.168.1.1');
AddPlayer(2, '192.168.1.2');
console.log(GetPlayerById(1)); // 输出 { id: 1, ip: '192.168.1.1' }
console.log(GetPlayerById(2)); // 输出 { id: 2, ip: '192.168.1.2' }
解释:
- Player类:定义了一个
Player
构造函数,用于创建新的玩家对象,并提供了一个方法GetPlayerInfo()
返回玩家的信息。 - 对象管理器:
mPlayerList
现在是一个对象,而非数组。每个玩家都通过其唯一的ID作为键存储在这个对象中,从而避免了覆盖问题。 - 添加玩家:
AddPlayer()
函数检查玩家是否已经存在,如果不存在,则创建并添加新玩家。 - 获取玩家信息:
GetPlayerById()
函数根据给定的ID查找玩家信息。
这种方法确保了每个玩家都是独立的对象,且不会被其他玩家的数据覆盖。