【问题标题】:Javascript call object methods from array?Javascript从数组调用对象方法?
【发布时间】:2015-02-12 03:22:16
【问题描述】:

我正在尝试遍历一组游戏对象并调用它们的更新方法。 游戏对象可以有不同的更新实现(例如:敌人的更新与朋友的更新不同),所以我创建了一个原型继承链。但我无法让它工作:在遍历所有对象时,我似乎无法调用它们的更新方法:编译器说它们不存在。所以我的问题是:是否可以在 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!!
}

【问题讨论】:

    标签: javascript arrays inheritance methods overriding


    【解决方案1】:

    这不是你的继承链的问题,而是这个构造

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

    当您使用for..in 迭代Array 时,变量将仅具有索引值。所以,gameobject 在每次迭代中都会有 01.. 像这样。 It is not recommended to use for..in to iterate an Array.

    你可能想像这样使用Array.prototype.forEach

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

    【讨论】:

    • 谢谢,现在可以了。我在错误的地方寻找问题。
    【解决方案2】:

    当您使用for ... in 遍历数组时,循环变量的值将是数组的,而不是值。

    你真的不应该那样遍历数组:

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

    【讨论】:

      【解决方案3】:

      试试这个,它对我有用:=)

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-10-24
        • 1970-01-01
        • 2011-10-22
        • 2017-11-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-11
        相关资源
        最近更新 更多