0

我正在通过EverCraft kata来提高我的 Javascript 技能并且遇到了一个小问题,我无法弄清楚如何按照我想要的方式工作。

我正在使用Jasmine进行测试并进行以下测试:

describe("As an attacker I want to be able to damage my enemies so that they will die and I will live", function () {
    var character = null;

    beforeEach(function () {
        character = new Character();
    });

    it("If attack is successful, other character takes 1 point of damage when hit", function () {

        var beginningHitPoints = character.HitPoints,
            roll = 15;

        character.Attacked(roll);

        expect(character.HitPoints).toBe(beginningHitPoints - 1);
    });
};

此测试失败,因为 character.hitPoints 为 5,但预期为 4。

我的 Character 对象代码是:(注意:为简洁起见,我省略了一些与此问题无关的代码)

var Character = function () {
    var hitPoints = 5,
        ...
        attacked = function (roll) {
            var isHit = isAHit(roll);

            if (isAHit) {
                hitPoints = hitPoints - 1;
            }
        }
        ...
    ;

    return {
        ...
        HitPoints: hitPoints,
        Attacked: attacked
        ...
    };
};

我想我理解正在发生的事情,只是不知道如何让它按我期望的方式工作。我相信当我返回时HitPoints: hitPoints,而不是像我预期的那样返回对的引用var hitPoints = 5,它实际上是在返回变量的值。换句话说,该声明相当于HitPoints: 5

我想知道的是,当我打电话时,我如何Attacked返回HitPoints更新的值hitPoints

4

2 回答 2

0

您的Character班级hitPoints错误地使用了属性,您需要有一个 getter 来获取hitPoints.

var Character = function () { var hitPoints = 5, ...被攻击 = function (roll) { var isHit = isAHit(roll);

        if (isAHit) {
            hitPoints = hitPoints - 1;
        }
    }
    ...
;

return {
    ...
    getHitPoints: function(){
        hitPoints;
    },
    Attacked: attacked
    ...
};

};

然后像这样使用它

var beginningHitPoints = character.getHitPoints(), roll = 15;
于 2013-05-27T03:01:45.927 回答
0

或者,考虑这样的事情,这样你就不必把它变成一个函数:

 var Character = function () {
    return {
       hitPoints: 5,
       attacked: function (roll) {
        this.hitPoints = this.hitPoints - 1;
       }
    };
 };

http://jsfiddle.net/QgVMn/3

在这种情况下,this指的是我们要返回的对象。

于 2013-05-27T03:06:42.857 回答