【问题标题】:JavaScript object goes crazy upon creation?JavaScript 对象在创建时变得疯狂?
【发布时间】:2012-06-08 04:43:30
【问题描述】:

我目前正在使用 Javascript 开发多人游戏,我的 PlayerList 数据结构/对象似乎有一个非常特殊的问题。

这是对象:

var PlayerList = function(){
    this.list = {};
}

该对象有几个方法,我通过这样做添加...

PlayerList.prototype.method = function(){...}

方法有:addPlayer、removePlayer、playerInList、findPlayer、jsonify和unjsonify。 我对 unjsonify 有一个巨大的 问题。代码如下:

PlayerList.prototype.unjsonify = function(jsonList){
    var object = JSON.parse(jsonList);
    var li = new PlayerList();
    console.log(li.list.x);
    console.log(li.list.y);
    console.log(li.list);
    //insert the fake player objects from the fake list into the new list as real player objects
    for(p in object.list){
        var pObj = object.list[p];
        //create real player object
        var player = new Player(pObj.name, pObj.x, pObj.y, pObj.velX, pObj.velY);
        li.addPlayer(player);
    }
    return li;
}

这样做的原因是因为如果我只是解析服务器发送的jsonList对象,结果对象具有正确的结构,但没有一个PlayerList应该有的方法。

问题出在这里:我后来注意到,当我遍历 PlayerList.list 并绘制每个玩家时,我得到了这个错误:

Uncaught TypeError: Object NaN has no method 'getX'

事实证明,由于某种原因,当我在 unjsonify 中创建一个新的 PlayerList 时,它有两个额外的字段 x 和 y,都设置为 NaN。问题出现在这里:

PlayerList.prototype.unjsonify = function(jsonList){
    var object = JSON.parse(jsonList);
    var li = new PlayerList();

由于一些非常奇怪的原因,li 不是一个新的空 PlayerList,就像它应该的那样。它包含两个额外的变量 x 和 y,都设置为 NaN。更奇怪的是,它不仅不是一个新的空列表,它还包含当前在服务器上的所有播放器——这对我来说似乎是不可能的,因为客户端第一次获取包含 json 播放器列表的包时它甚至没有有自己的过去版本可以摆脱。

最重要的是,如果您查看 unjsonify 的代码块,console.log(li.list.x) 和 console.log(li.list.y) 都会输出 undefined,但随后 console.log(li.list) 输出一个对象,其中(除了服务器上的所有玩家)字段 x 和 y 设置为 NaN。

我完全不知道这怎么可能发生。似乎没有人可以解决这些错误之一,因为它们没有任何意义。但是,如果有人对如何帮助我有丝毫的想法,将不胜感激!

我应该注意,在我拥有这个 PlayerList 对象之前,我只是使用了一个没有任何方法的对象原语并手动完成了所有操作(例如 pList.username = player 添加玩家等...)并且一切正常(我可以看到其他玩家在我的屏幕上移动,等等。)但是由于此时它变得非常大,我想添加一些结构,因此我创建了这个 PlayerList 对象,它应该使我的代码更加结构化和漂亮,但到目前为止只有造成的问题比其他任何事情都多。

【问题讨论】:

  • 您是否在 PlayerList 构造函数中放置了一个断点,以确定您的构造函数是否被多次调用?
  • 好主意 - 奇怪的是,它只在另一个文件 main.js 中调用一次,以创建初始 var plist = new PlayerList() 所以我以后可以通过 plist.unjsonify( json)。但它只被调用一次?这怎么可能?
  • 从发布的代码中,我看不出为什么会发生这种情况;如果您的构造函数真的那么短,那么可以用其他东西填充它的唯一方法是通过原型链......
  • 代码在这里似乎可以正常工作:jsfiddle.net/slace/BL6Nq

标签: javascript json nan javascript-objects


【解决方案1】:

您的 PlayerList 没有 .addPlay 方法。

在处理代码时,将变量命名在可读的位置会更容易。

 function PlayerList() {
                this.list = [];
         };
            //
 PlayerList.prototype.unjsonify = function (jsonList) {
          var jsonLst = JSON.parse(jsonList),
                    myPlayerList = new PlayerList(),
                    player,
                    jsonItem;
                //
      for (var i = 0; i < jsonLst.list.length; i++) {
                    jsonItem = jsonLst.list[i];
                    //
                    player = new Player(jsonItem.name, jsonItem.x, jsonItem.y, jsonItem.velX, jsonItem.velY);

                    myPlayerList.list.push(player);

                };
                return myPlayerList;
            };

我已将您的 Player.list 从一个对象更改为一个数组。

【讨论】:

  • 我有点困惑,你是什么意思 PlayerList 没有 .addPlay 方法?你的意思是写 .addPlayer 吗?因为它确实有一个 .addPlayer 方法。这不是你的意思吗?否则,将列表转换为数组可能是个好主意。唯一的问题是无法通过用户名(我用于密钥)查找玩家。不过我会试试的。
  • 哇...即使我将其更改为数组后,x 和 y 也会弹出并设置为 NaN。
  • 你能发布足够的代码让我模拟发生了什么吗?一些播放列表数据也会很好。
  • 你知道,这太疯狂了,我决定重写那部分代码并且它成功了。我不知道是什么导致了这个问题,但我认为我设法以某种方式污染了 PlayerList 对象的原型。不过,你一直很有帮助,所以谢谢你!
  • 论坛如此精彩的原因在于,您的问题可能模糊也可能不模糊,您的答案可能准确也可能不准确,但发帖、提问和回答的过程总是会带来新的视角到这个问题上。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-15
  • 2021-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-25
  • 1970-01-01
相关资源
最近更新 更多