访问方法中的属性

时间:2014-11-11 19:23:02

标签: javascript oop

我只是为了练习而制作简单的JS游戏。我遇到了一个我不知道如何命名的问题。标题可能完全不正确。但无论如何,这是我的代码。

    function Battle () {
    this.name;
    this.pointsAmount = 100;
    this.attack = function attack (opponent) {
        opponent.pointsAmount -= 30;
        alert(this.name + " hit " + opponent.name);
    };
};

var player1 = new Battle ();
var player2 = new Battle ();

// players
player1.name = "Lorem";
player2.name = "Ipsum";

player1.attack(player2);
    alert(player2.name+ ' has lost ' + opponent.pointsAmount + ' points.');

因此,我想访问attack函数中具有值30的属性。 Chrome开发者工具会返回opponent is not defined。关于这个问题的任何建议?感谢。

5 个答案:

答案 0 :(得分:2)

opponent仅在攻击方法内定义;它不能在该方法之外引用。这就是为什么这一行

alert(player2.name+ ' has lost ' + opponent.pointsAmount + ' points.');

失败了。将opponent替换为player2(只有)。

另一方面,对于每个玩家来说,没有理由一遍又一遍地重新定义攻击方法。你可以考虑像这样定义它

Battle.prototype.attack = function(opponent) {
    opponent.pointsAmount -= 30;
    alert(this.name + " hit " + opponent.name);
};

答案 1 :(得分:1)

JavaScript中的变量只是指向对象的指针。在你的例子中,对手只是对player2对象的引用,因为那是你传递给函数的参数。从攻击之外,您可以简单地将对象引用为player2。

alert(player2.name+ ' has lost ' + player2.pointsAmount + ' points.');

答案 2 :(得分:1)

如果你想得到丢失了多少分,你必须要像......

var preAmount = player2.pointsAmount;
player1.attack(player2);
alert(player2.name+ ' has lost ' + (preAmount - player2.pointsAmount) + ' points.');

答案 3 :(得分:0)

您应该执行以下操作:

alert(player2.name+ ' has lost 30 points.');

只要每次攻击花费30分,这都很好:)。否则,如果你想说玩家2剩下多少分数:

alert(player2.name+ ' has ' + player2.pointsAmount + ' points left.');

答案 4 :(得分:0)

这是我的变体:-)我为Battle类添加了一个新变量pointsLostOnPrevAttack

function Battle () {
    this.name;
    this.pointsAmount = 100;
    this.pointsLostOnPrevAttack;
    this.attack = function attack (opponent) {
        opponent.pointsAmount -= 30;
        opponent.pointsLostOnPrevAttack = 30;
        alert(this.name + " hit " + opponent.name);
    };
};


player1.attack(player2);
    alert(player2.name+ ' has lost ' + player2.pointsLostOnPrevAttack + ' points and has now '+ player2.pointsAmount + " points left");

现在它发出警报" Ipsum已经失去了30分并且还剩下70分"