将对象的属性作为参数发送给函数会返回undefined

时间:2013-10-25 08:11:50

标签: javascript jquery object

我正在进入javascript / jQuery,因此正在构建一个Plant vs Zombies。我为敌人创建了一个对象,并为每个显示该代码的敌人创建一个参考: 这是对象:

var Enemy = function(row, num) {
    'use strict';
    this.row = row;
    this.number = num; 
    this.move_interval;
    this.html_element;
};
Enemy.prototype.create = function() {
    this.html_element = $('<div class="enemy '+this.row+' full" style="left:1140px;top: '+$('tr.row_'+this.row).position().top+'px"></div>').prependTo('.container');

    return this;
};
Enemy.prototype.die = function() {
    clearInterval(this.move_interval);
    this.html_element.remove();
    return this;
};
Enemy.prototype.move = function() {
    this.move_interval = setInterval(function() {moveEnemy(this.number)}, 2000);
    return this;
};

这是创建敌人的间隔(我被定义为全局变量“var i = 0;”):

enemy_interval = setInterval("addEnemy(i++)", 9000)}

这是创建敌人的功能(随机的东西是因为我有四行可以产生敌人,这也就是对象中属性行的含义):

function addEnemy(num) {
    if (num < 5) {
        switch (getRandom(1,4)) {
            case 1:
                enemies[num] = new Enemy("one", num);
                enemies[num].create().move();
                break;
            case 2:
                enemies[num] = new Enemy("two", num)
                enemies[num].create().move();
                break;
            case 3:
                enemies[num] = new Enemy("three", num)
                enemies[num].create().move();
                break;
            case 4:
                enemies[num] = new Enemy("four", num)
                enemies[num].create().move();
                break;
            default:
                break;
        }
    }
}

这是出现错误的地方:

function moveEnemy(number) {
    enemies[number].html_element.animate({left: "-=150"}, 2000, "linear");
}

我已经通过编辑moveEnemy函数尝试了几种方法来获取属性“html_element”作为参数并按此方式执行:

function moveEnemy(obj) {
    obj.animate({left: "-=150"}, 2000, "linear");
}

我试图像敌人[编号] [html_element]一样写它,因为我读到这实际上是获得一个属性的方式,但它不起作用。它总是告诉我参数('obj'或如上'数'是未定义的)。

有人能够看到这个错误吗? d:

1 个答案:

答案 0 :(得分:0)

问题出现在setInterval函数中,其中范围已更改,this已成为全局(窗口)对象。

将您的move功能更改为:

Enemy.prototype.move = function() {
    var me = this;
    this.move_interval = setInterval(function() {moveEnemy(me.number)}, 2000);
    return this;
};