Объект JavaScript сходит с ума при создании?

В настоящее время я работаю над многопользовательской игрой на 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: объект NaN не имеет метода getX

Как оказалось, по какой-то причине, когда я создал новый PlayerList в unjsonify, в нем было два дополнительных поля, 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, который должен сделать мой код более структурированным и красивым, но до сих пор вызывал только больше проблем чем что-либо еще.


person tborenst    schedule 04.06.2012    source источник
comment
Вы поставили точку останова в конструкторе PlayerList, чтобы узнать, может быть, ваш конструктор вызывается несколько раз?   -  person Ja͢ck    schedule 04.06.2012
comment
Хорошая идея — как ни странно, она вызывается только один раз в другом файле, main.js, для создания начальной переменной var plist = new PlayerList(), чтобы позже я мог вызвать unjsonify, выполнив plist.unjsonify(json). Но он вызывается только один раз? Как это возможно?   -  person tborenst    schedule 04.06.2012
comment
Из опубликованного кода я не понимаю, почему это произошло; если ваш конструктор действительно такой короткий, единственный способ заполнить его другими вещами - через цепочку прототипов...   -  person Ja͢ck    schedule 04.06.2012
comment
Здесь код работал нормально: jsfiddle.net/slace/BL6Nq   -  person Aaron Powell    schedule 04.06.2012


Ответы (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 с объекта на массив.

person Vinyl Windows    schedule 04.06.2012
comment
Я немного запутался, что вы имеете в виду, что в PlayerList нет метода .addPlay? Вы хотели написать .addPlayer? Потому что у него есть метод .addPlayer. Разве это не то, что вы имели в виду? В противном случае преобразование списка в массив, вероятно, является хорошей идеей. Единственная проблема заключается в невозможности поиска игроков по их имени пользователя (то, что я использовал для ключа). Я попробую это все же. - person tborenst; 04.06.2012
comment
Вау... Даже после того, как я изменил его на массив, x и y всплывают и устанавливаются в NaN. - person tborenst; 04.06.2012
comment
Можете ли вы опубликовать достаточно кода, чтобы я мог смоделировать происходящее? Некоторые данные плейлиста также будут хороши. - person Vinyl Windows; 04.06.2012
comment
Знаете, это было так безумно, что я решил переписать эту часть кода, и это сработало. Я понятия не имею, что вызвало проблему, но я предполагаю, что мне каким-то образом удалось как-то загрязнить прототип объекта PlayerList. Тем не менее, вы были полезны, так что спасибо! - person tborenst; 06.06.2012
comment
Что делает форумы такими замечательными, так это то, что ваш вопрос может быть или не быть размытым, а ваш ответ может быть или не быть точным, но процесс публикации, вопроса и ответа всегда отбрасывает новую точку зрения на проблему. - person Vinyl Windows; 06.06.2012