如何在对象内编写可重用的函数

时间:2014-05-26 00:25:28

标签: javascript

我在JavaScript中制作了一个小小的猜谜游戏。我写了一个函数,返回一个字母来表示result。它返回w以获得"赢了," l用于"丢失,"和d用于"绘制"。

每次添加新匹配时,我都必须重复计算result属性的函数。我怎样才能使它不必重复计算每场比赛结果的逻辑?

{
    name: 'Elmer',
    matches: [{
        against: 'Roger',
        score_for: 3,
        score_against: 1,
        result: function () {
            if (this.score_for > this.score_against) {
                return 'w';
            } else if (this.score_for < this.score_against) {
                return 'l';
            } else {
                return 't';
            }
        }
    }, {
        against: 'Marvin',
        score_for: 1,
        score_against: 1
    }]
}

2 个答案:

答案 0 :(得分:1)

我建议使用模块模式:

例如:

var Player = (function() {
    function Player (name) {
        this.name = name;
        this.matches = [];
    }

    Player.prototype.setMatches = function (matches) {
        this.matches = matches;
    };

    Player.prototype.getGamesPlayed = function () {
        return this.matches.length;
    };

    Player.prototype.getMatches = function () {
        return this.matches;
    };

    return Player;
})();

然后你可以做这样的事情:

var elmo = new Player('Elmo');
elmo.setMatches({
        against: 'Roger',
        score_for: 3,
        score_against: 1
    }, {
        against: 'Marvin',
        score_for: 1,
        score_against: 1
    });
/// etc...

答案 1 :(得分:1)

  

我怎样才能这样做,以便我不必重复计算每场比赛结果的逻辑?

只需对现有代码进行最少的更改,只需声明包含逻辑的命名函数:

function result() {
    if (this.score_for > this.score_against) {
        return 'w';
    } else if (this.score_for < this.score_against) {
        return 'l';
    } else {
        return 't';
    }
}

然后将其指定为每个匹配的属性:

var game = {
    name: 'Elmer',
    matches: [{
        against: 'Roger',
        score_for: 3,
        score_against: 1,
        result: result
    }, {
        against: 'Marvin',
        score_for: 1,
        score_against: 1
    }]
};

函数只是一种特殊的对象,因此您可以像任何其他值一样分配,传递和返回它们。


或者你可以定义函数,使接受匹配作为参数:

function getResult(match) {
    if (match.score_for > match.score_against) {
        return 'w';
    } else if (match.score_for < match.score_against) {
        return 'l';
    } else {
        return 't';
    }
}

以后,而不是someMatch.result(),而是getResult(someMatch)


了解有关函数和对象的更多信息: