2014-12-13 61 views
0

我想循環訪問一個gameobjects數組並調用它們的更新方法。 Gameobjects可以有不同的更新實現(例如:更新敵人不同於朋友更新),所以我創建了一個原型繼承鏈。但我無法實現它:在遍歷所有對象時,我似乎無法調用它們的更新方法:編譯器說它們不存在。所以我的問題是:是否有可能在Javascript中循環共享相同基類的對象數組,並調用可以被不同子類覆蓋的方法?Javascript從數組中調用對象方法?

這是我到目前爲止,不知道我哪裏錯了...:

//base gameobject class 
function GameObject(name) { 
    this.name = name 
}; 
GameObject.prototype.update = function(deltaTime) { 
    throw new Error("can't call abstract method!") 
}; 

//enemy inherits from gameobject 
function Enemy() { 
    GameObject.apply(this, arguments) 
}; 
Enemy.prototype = new GameObject(); 
Enemy.prototype.constructor = Enemy; 
Enemy.prototype.update = function(deltaTime) { 
    alert("In update of Enemy " + this.name); 
}; 


var gameobjects = new Array(); 

// add enemy to array 
gameobjects[gameobjects.length] = new Enemy("weirdenemy"); 

// this doesn't work: says 'gameobject doesn't have update method' 
for (gameobject in gameobjects) { 
    gameobject.update(1); // doesn't work!! 
} 

回答

1

它不是你繼承鏈出了問題,但這種構造

for(gameobject in gameobjects){ 
    gameobject.update(1); // doesn't work!! 
} 

當您迭代Arrayfor..in時,該變量將僅具有索引值。所以,gameobject將有0,1 ..就像那樣,在每一次迭代。 It is not recommended to use for..in to iterate an Array.

您可能希望通過與for ... in數組當你迭代使用,Array.prototype.forEach,這樣

gameobjects.forEach(function(gameObject) { 
    gameObject.update(1); 
}); 
+0

謝謝你,現在的工作。我在錯誤的地方尋找問題。 – svanheste 2014-12-13 15:07:56

0

,循環變量的值將是的陣列,而不是值。

你真的不應該通過遍歷數組這樣反正:

for (var i = 0; i < gameobjects.length; ++i) 
    gameobjects[i].update(1); 
0

試試這個,它爲我工作:=)

gameobjects.forEach(function(gameobject){ 
     gameobject.update(1); // doesn't work!! 
    }); 
相關問題