我正在尝试遍历一系列游戏对象并调用他们的更新方法。 Gameobjects可以有不同的更新实现(例如:敌人的更新与朋友的更新不同),所以我创建了一个原型继承链。但我不能让它工作:在循环遍历所有对象时,我似乎无法调用它们的更新方法:编译器说它们不存在。所以我的问题是:在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!!
}
答案 0 :(得分:1)
它的继承链不是问题,但使用此构造
for(gameobject in gameobjects){
gameobject.update(1); // doesn't work!!
}
当您使用Array
迭代for..in
时,该变量将仅包含索引值。因此,gameobject
将在每次迭代中都有0
,1
.. It is not recommended to use for..in
to iterate an Array.
您可能想要使用Array.prototype.forEach
,就像这样
gameobjects.forEach(function(gameObject) {
gameObject.update(1);
});
答案 1 :(得分:0)
当您使用for ... in
迭代数组时,循环变量的值将是数组的键,而不是值。
你真的不应该以这种方式迭代数组:
for (var i = 0; i < gameobjects.length; ++i)
gameobjects[i].update(1);
答案 2 :(得分:0)
试试这个,它对我有用:=)
gameobjects.forEach(function(gameobject){
gameobject.update(1); // doesn't work!!
});