JavaScript对象在创建时变得疯狂?

JavaScript对象在创建时变得疯狂?,javascript,json,nan,javascript-objects,Javascript,Json,Nan,Javascript Objects,我目前正在用Javascript开发一个多人游戏,我的PlayerList数据结构/对象似乎有一个非常特殊的问题 以下是对象: var PlayerList = function(){ this.list = {}; } 该对象有几个方法,我通过执行 PlayerList.prototype.method = function(){...} 方法有:addPlayer、removePlayer、playerlist、findPlayer、jsonify和unjsonify。 我有一个

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

以下是对象:

var PlayerList = function(){
    this.list = {};
}
该对象有几个方法,我通过执行

PlayerList.prototype.method = function(){...}
方法有:addPlayer、removePlayer、playerlist、findPlayer、jsonify和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并绘制每个玩家时,我得到以下错误:

未捕获的TypeError:对象NaN没有方法“getX”

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

PlayerList.prototype.unjsonify = function(jsonList){
    var object = JSON.parse(jsonList);
    var li = new PlayerList();
出于一些非常奇怪的原因,李彦宏并不是一个新的空手球员。它包含两个额外变量x和y,都设置为NaN。更奇怪的是,它不仅不是一个新的空列表,它还包含了服务器上当前的所有玩家——这对我来说似乎是不可能的,因为客户端第一次获得包含json玩家列表的包时,它甚至没有自己的旧版本

最重要的是,如果您查看unjsonify的代码块,console.log(li.list.x)和console.log(li.list.y)都输出未定义,但是console.log(li.list)输出的对象(除了服务器上的所有播放机外)字段x和y设置为NaN

我完全不知道这怎么会发生。这似乎是一个没有人能解决的bug,因为它们根本没有任何意义。但是如果有人对如何帮助我有一点点想法,我将不胜感激


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

您的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;
            };
function PlayerList(){
this.list=[];
};
//
PlayerList.prototype.unjsonify=函数(jsonList){
var jsonLst=JSON.parse(jsonList),
myPlayerList=新的PlayerList(),
游戏者
犹太教徒;
//
对于(var i=0;i

我已将你的Player.list从对象更改为数组

您的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;
            };
function PlayerList(){
this.list=[];
};
//
PlayerList.prototype.unjsonify=函数(jsonList){
var jsonLst=JSON.parse(jsonList),
myPlayerList=新的PlayerList(),
游戏者
犹太教徒;
//
对于(var i=0;i

我已将你的Player.list从对象更改为数组

您是否在PlayerList构造函数中放置了一个断点,以确定您的构造函数是否被多次调用?好主意-奇怪的是,它在另一个文件main.js中只被调用一次,以创建初始变量plist=new PlayerList(),以便稍后我可以通过执行plist.unjsonify(json)调用unjsonify。但它只被调用一次?这怎么可能?从发布的代码中,我看不出为什么会发生这种情况;如果你的构造函数真的那么短,那么用其他东西填充它的唯一方法就是通过原型链…这里的代码似乎工作得很好:你是否在PlayerList构造函数中设置了一个断点,以确定你的构造函数是否被多次调用?好主意-奇怪的是,它在另一个文件main.js中只被调用一次,创建初始变量plist=new PlayerList(),以便稍后通过执行plist.unjsonify(json)调用unjsonify。但它只被调用一次?这怎么可能?从发布的代码中,我看不出为什么会发生这种情况;如果你的构造函数真的那么短,那么用其他东西填充它的唯一方法就是通过原型链…这里的代码似乎工作得很好:我有点困惑,你说PlayerList没有.addPlay方法是什么意思?你是想写吗,addPlayer?因为它确实有一个.addPlayer方法。这不是你的意思吗?否则,将列表转换为数组可能是一个好主意。唯一的问题是无法通过用户名(我使用的密钥)查找玩家。我会试试的。哇。。。即使在我将其更改为数组后,x和y也会弹出并设置为NaN。您能为我发布足够的代码来模拟正在发生的事情吗?一些播放列表数据也会很好