我在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
}]
}
答案 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)
。
了解有关函数和对象的更多信息: