我目前正在使用Javascript進行多人遊戲,並且我的PlayerList數據結構/對象似乎有一個非常奇怪的問題。JavaScript對象在創建時變得瘋狂嗎?
這裏是對象:
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'
事實證明,由於某種原因,當我創建了一個新的PlayerList in unjsonify它有兩個額外的字段,x和y,都設置爲NaN。出現問題就在這裏:
PlayerList.prototype.unjsonify = function(jsonList){
var object = JSON.parse(jsonList);
var li = new PlayerList();
一些非常奇怪的原因,李是不喜歡它一個新的空PlayerList應該的。它包含兩個額外的變量,x和y,都設置爲NaN。即使是比較奇怪的,它不僅僅是一個新的空白列表,它包含了所有當前在服務器上的玩家 - 這對我來說似乎是不可能的,因爲第一次客戶端獲得包含json播放列表的包時,它甚至不會有一個過去的版本本身去掉。
最糟糕的是,如果你看的代碼塊unjsonify,執行console.log(li.list.x)和執行console.log(li.list.y)兩個輸出不確定,但然後console.log(li.list)輸出一個Object(除了服務器上的所有播放器)字段x和y設置爲NaN。
我完全失去了這種情況,甚至可能發生。看起來這些錯誤之一是沒人能解決的,因爲它們沒有任何意義。但如果有人對如何幫助我有絲毫的想法,將不勝感激!
我應該注意,在我有這個PlayerList對象之前,我只是使用了一個沒有任何方法的對象原語,並且手動完成了所有的事情(例如pList.username = player來添加播放器等等)可以看到其他玩家在我的屏幕上移動等等)但是由於這一點變得非常大,我想添加一些結構,因此我創建了這個PlayerList對象,它應該使我的代碼更加結構化和漂亮,但迄今爲止只引起了比其他事情更多的問題。
你有沒有在PlayerList構造函數中放置一個斷點,以查明你的構造函數是否被多次調用? –
好主意 - 奇怪的是,它只在另一個文件main.js中調用一次,以創建初始var plist = new PlayerList(),因此我可以通過執行plist.unjsonify(json)來調用unjsonify。但它只被調用一次?這怎麼可能? – tborenst
從發佈的代碼中,我看不出爲什麼會發生這種情況;如果你的構造函數真的很短,它可以用其他東西填充的唯一方式是通過原型鏈... –