javascript替代严格的评估

时间:2012-01-14 22:43:55

标签: javascript function pass-by-reference

我正在制作一个javascript游戏,有几个级别,存储在json中。 加载时,我运行一个函数来“解析”关卡对象,方法是替换默认值不存在的值,或者用对象替换某些值,例如:

//i is the variable I use to loop through the enemies

if (typeof(level.enemies[i].life)=="undefined") {
 level.enemies[i].life=100;
}

if (typeof(level.enemies[i].follow)=="number") {
 level.enemies[i].follow=level.enemies[level.enemies[i].follow];
 // replace the number of the enemy,
 // by a reference to the actual enemy.
}

问题是我在整个函数中有很多类似于这些的“ifs”,我想知道我是否能以某种方式将它们缩减为函数,所以我可以这样做:

replaceByType(level.enemies[i].life,"undefined",100);
replaceByType(level.enemies[i].follow,"number",level.enemies[level.enemies[i].follow]);

可悲的是,我不知道如何做到这一点,因为他们无法通过引用传递变量(除了对象)。也许有另一种方法来简化我的代码?

3 个答案:

答案 0 :(得分:1)

我想你想要这样的东西:

replaceIfAbsent(level.enemies[i], "life", 100);

function replaceIfAbsent(obj, property, newVal){
   if (typeof obj[property] === "undefined")
       obj[property] = newVal;
}

或者为什么不一次做多个属性:

function replaceIfAbsent(obj, properties){
   for (var prop in properties)
       if (typeof obj[prop.name] === "undefined")
           obj[prop.name] = prop.value;
}

replaceIfAbsent(level.enemies[i], [{name: "life", value: 100}, {name: "number", value: 12}]);

您使用的是jQuery吗?如果是这样,你可以这样做:

$.extend(level.enemies[i], {"life": 100, "number": 12});

答案 1 :(得分:0)

Pass anonymous functions:

function replaceByType(test, pass, fail){
   if(test()) return pass;
   else return fail;
}

replaceByType(function(){return level.enemies[i].life},"undefined",100);

这将评估推迟到replaceByType内。

答案 2 :(得分:0)

由于您可以通过引用传递对象,因此可以传递要替换的对象的属性。

function replaceByType(obj, property, type, value) {
   if(typeof obj[property] === type) {
     obj[property] = value;
   }
}

你几乎可以打电话给你:

replaceByType(level.enemies[i], "life", "undefined", 100); 
replaceByType(level.enemies[i], "follow", "number", level.enemies[level.enemies[i].follow]);