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是一个静态对象,所有实例共享同一个对象引用,因此每次创建新实例时都会覆盖之前的数据。

解决方案

为了更好地管理玩家对象,我们可以采用以下方法:

  1. 使用唯一标识符:每个玩家应该有一个唯一的ID,而不是直接用ID作为数组的索引。
  2. 避免静态对象引用:确保每个玩家实例有自己的数据副本。

示例代码

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

解释

  1. Player构造函数:定义了一个Player构造函数,每个实例都有自己的idip属性。
  2. getPlayerInfo方法:返回当前玩家的信息对象,而不是引用同一个静态对象。
  3. 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查找玩家信息。

这种方法确保了每个玩家都是独立的对象,且不会被其他玩家的数据覆盖。

回到顶部