JavaScript 中的两个字符串是否可以通过连接来调用变量?
Is it possible to call a variable by concatenating two strings in JavaScript?
我正在努力压缩我的代码,我已经阅读了很多关于连接变量的文章,但我无法让任何东西按照我需要的方式工作。
下面是两段代码。它们在功能上是相同的,除了第一个片段的名称中使用 'Str' 的变量,而第二个片段使用 'Dex' 代替。我计划使用 'Int' 和 'Ht' 创建类似的代码,但我不想复制/粘贴然后回去一遍又一遍地更改整个代码中的 'Str, Dex, Int, Ht' 名称。
是否可以将 'Str, Dex, Int, Ht' 放入变量 [var1] 中(根据按下的按钮)然后使用 [var1] 代替 'Str, Dex, Int, Ht' 以便代码只有写一次?
//Define Stength Increase Function
var strIncrease = function () {
//Increase playerStrength by 1
playerStr = playerStr + 1;
playerStrDisplay.innerHTML = playerStr;
//Increase strengthCP by 10
strCP = strCP + strCost;
strCPDisplay.innerHTML = strCP;
//Decrease totalCP by 10
totalCP = totalCP - strCost;
totalCPDisplay.innerHTML = totalCP;
}
//Define Dexterity Increase Function
var dexIncrease = function () {
//Increase playerDexterity by 1
playerDex = playerDex + 1;
playerDexDisplay.innerHTML = playerDex;
//Increase DexterityCP by 20
dexCP = dexCP + dexCost;
dexCPDisplay.innerHTML = dexCP;
//Decrease totalCP by 20
totalCP = totalCP - dexCost;
totalCPDisplay.innerHTML = totalCP;
}
您可以将对象用作地图:
var player = { str: 0, dex: 0, ... };
function increase(stat) {
player[stat]++;
document.getElementById(stat + 'Display').innerHTML = player[stat];
}
increate('str');
您可以将属性定义为对象的属性并使用字符串访问它们,如下所示:
var player = {
str: 1,
dex: 1,
in: 1,
ht: 1,
strCP: 10,
dexCP: 10,
intCP: 10,
htCP: 10,
totalCP: 0
},
costs = {
strCost: 10,
dexCost: 10,
inCost: 10,
htCost: 10
};
function increaseAttribute(player, costs, attr) {
player[attr] += 1;
player[attr + "CP"] += costs[attr + "Cost"];
player.totalCP += costs[attr + "Cost"];
.
.
}
function increaseStr () {
increaseAttribute(player, costs, attr);
}
.
.
.
您可以使用closure
动态生成方法。
例如
var player = {
str : 0
dex : 0
int : 0
ht : 0
}
function methodFactory (player, property, diff) {
var mathod = function () {
player[property] += diff;
}
return method;
}
然后
var addInt = methodFactory (player, 'int', 1);
var addIntBy2 = methodFactory (player, 'int', 2);
addInt();
一次编写,随处使用
我正在努力压缩我的代码,我已经阅读了很多关于连接变量的文章,但我无法让任何东西按照我需要的方式工作。
下面是两段代码。它们在功能上是相同的,除了第一个片段的名称中使用 'Str' 的变量,而第二个片段使用 'Dex' 代替。我计划使用 'Int' 和 'Ht' 创建类似的代码,但我不想复制/粘贴然后回去一遍又一遍地更改整个代码中的 'Str, Dex, Int, Ht' 名称。
是否可以将 'Str, Dex, Int, Ht' 放入变量 [var1] 中(根据按下的按钮)然后使用 [var1] 代替 'Str, Dex, Int, Ht' 以便代码只有写一次?
//Define Stength Increase Function
var strIncrease = function () {
//Increase playerStrength by 1
playerStr = playerStr + 1;
playerStrDisplay.innerHTML = playerStr;
//Increase strengthCP by 10
strCP = strCP + strCost;
strCPDisplay.innerHTML = strCP;
//Decrease totalCP by 10
totalCP = totalCP - strCost;
totalCPDisplay.innerHTML = totalCP;
}
//Define Dexterity Increase Function
var dexIncrease = function () {
//Increase playerDexterity by 1
playerDex = playerDex + 1;
playerDexDisplay.innerHTML = playerDex;
//Increase DexterityCP by 20
dexCP = dexCP + dexCost;
dexCPDisplay.innerHTML = dexCP;
//Decrease totalCP by 20
totalCP = totalCP - dexCost;
totalCPDisplay.innerHTML = totalCP;
}
您可以将对象用作地图:
var player = { str: 0, dex: 0, ... };
function increase(stat) {
player[stat]++;
document.getElementById(stat + 'Display').innerHTML = player[stat];
}
increate('str');
您可以将属性定义为对象的属性并使用字符串访问它们,如下所示:
var player = {
str: 1,
dex: 1,
in: 1,
ht: 1,
strCP: 10,
dexCP: 10,
intCP: 10,
htCP: 10,
totalCP: 0
},
costs = {
strCost: 10,
dexCost: 10,
inCost: 10,
htCost: 10
};
function increaseAttribute(player, costs, attr) {
player[attr] += 1;
player[attr + "CP"] += costs[attr + "Cost"];
player.totalCP += costs[attr + "Cost"];
.
.
}
function increaseStr () {
increaseAttribute(player, costs, attr);
}
.
.
.
您可以使用closure
动态生成方法。
例如
var player = {
str : 0
dex : 0
int : 0
ht : 0
}
function methodFactory (player, property, diff) {
var mathod = function () {
player[property] += diff;
}
return method;
}
然后
var addInt = methodFactory (player, 'int', 1);
var addIntBy2 = methodFactory (player, 'int', 2);
addInt();
一次编写,随处使用