对于大量的变量来说哪个更好

时间:2013-05-31 01:01:12

标签: javascript html5

所以在过去几天大量阅读JS之后(我刚刚开始)我已经为我的项目提供了3个可行的选项,这是一个游戏顺便说一下。我的游戏中将有大约200个项目,总共约30个统计/属性。但是因为程序必须知道剑不会造成法术伤害,所以即使90%将是0,我必须给每个项目所有这30个属性。所以这是我提出的,任何建议都非常感谢:

var prop, obj = { Item1: "Boots", Item2: "Gloves", Item3: "Sword", Item4: "Cape" };

//很确定我不得不以某种方式重新制作这些属性,这可能不会那么有用

function Item(hp, mp, dmg, spd, luk) {
    this.hp = hp;
    this.mp = mp;
    this.dmg = dmg;
    this.spd = spd;
    this.luk = luk;
}
var BigSword = new Item(0, 0, 50, 20, 10)

//我认为这可能是我最好的选择,因此变量尽可能少?或者那不重要吗?每当我在更新函数中更新totalHp和totalMp以及totalDmg等时,我都会想到这个选项,我可以创建一个名为theItem = BigSword的局部变量,然后只需执行theItem.hp,theItem.mp,这样就不需要搜索多少对于变量而言应该运行得相对较快?很抱歉新手问题,但JS甚至在函数中有局部变量吗?如果我执行var theItem = whatever,那么theItem将在函数外部为空?

itemNames = [ "Boots", "Gloves", "Sword", "Cape" ];
itemHp = [ 0, 0, 0, 50 ];
itemMp = [ 0, 30, 0, 0 ];
itemDmg = [ 0, 0, 50, 0 ];
itemSpd = [ 50, 0, 0, 0];

//这是我提出的另一个选项,有点丑陋,但如果使用数组更快或更好,我不介意那么多。

但请记住,就像我说的那样,总共有200个项目,每个项目将有大约30个属性。你觉得怎么样?

非常感谢阅读和提供的任何信息,非常感谢!提前致谢

3 个答案:

答案 0 :(得分:4)

你最好的选择就是拥有一个构造函数,就像你在第一个例子中所做的那样。但是,我会改变一些事情。首先,对于构造函数,您只需传递大量数字。这是错误,因为很容易忘记你的号码的顺序。更好的方法是将对象传递给构造函数,这样就可以标记每个属性:

function Item(props) {
    this.hp = props.hp;
    this.mp = props.mp;
    this.dmg = props.dmg;
    this.spd = props.spd;
    this.luk = props.luk;
}

var BigSword = new Item({
    hp: 0, 
    mp: 0, 5
    dmg: 0, 
    spd: 20, 
    luk: 10
});

这很好,但仍然很痛苦,因为你有各种不同的项目,正如你所说,你必须为每个项目定义30个属性,这既麻烦又耗时。此时,您将进入更复杂的面向对象的领域。从这里你基本上有两个选择:继承和构造。

继承

使用对象继承来正确定义对象可能是两者中最常见的,并且相当简单。从本质上讲,你有一个对象的“类”,然后是每个类的子类。因此,您可能将魔法物品和非魔法物品分为两类。如果你有一个魔术带,也许,你想让它继承魔法物品类的属性。另一方面,如果你有一个基本的非魅力剑,你想让它继承非魔法物品类。

但是说你有神奇的卷轴和魔法药水。那些都是神奇的物品,对吗?所以你想要创建一个名为Potions的类和一个名为Scrolls的类,它们都继承自Magical Item类。那么你可能会有某些类型的魔药。治疗药水,也许 - “治愈盟友的魔法药水”和“治疗自我的魔法药水”。所以你需要不同的课程 - 依此类推。

Javascript中的继承可以通过多种不同的方式完成,并且可以非常深入,所以我不打算在我的帖子中讨论它。这里有一些有用的链接可以让你开始继承,但是,如果你想走那条路:

组合物

组合是一种概念,它大量借用其他松散类型的语言,例如Python,它非常广泛地使用它。组合背后的基本思想是你有一个基础对象类,每当你需要某个特定类型的对象时,你就可以向这个基类添加行为或成员。这不像继承那么众所周知,但它绝对是我喜欢的。

在Javascript中,它通过使用基础构造函数Item,然后使用其他构造函数向Item添加必要的行为来工作。让我们来看看我用于构图的例子 - 创造一个治愈盟友的魔法药水。你在这里有几个不同的属性:魔法物品,药水,治疗。通过继承,您可以执行Item -> Magical -> Potion -> Healing Potions -> Allies之类的操作。但是,通过组合,您可以向基础Item类添加多个行为,而无需设置庞大的原型链:Affect AlliesPotionHealing

由于组合比继承更简单(而且,我承认,我有偏见)我将在伪代码中设置一个快速示例:

// base item class
function Item(props) {
    this.someProperty = props.someProperty;
    this.someOtherProperty = props.someOtherProperty;
}

// potion behavior
function Potion(props) {
    this.amount = props.amount; // IDK what amount means, just some random potion property
    this.color = "green";
}

// healing behavior
function Healing(props) {
    this.amountToHeal = props.amountToHeal;
    this.cooldown = props.cooldown;
}

// behavior to affect allies
function AffectAllies(props) {
    this.allies = props.allies;
    for(ally in this.allies) {
        this.allies[ally].affect(props.affact);
    }
}

// at this point we have the various behaviors set up and we can create the Magical Potion of Heal Allies constructor:

function MassHealingPotion(props) {
    var self = this;

    this.amount = props.amount;
    this.potion = new Potion(props);
    this.effect = new Healing(props);
    this.AffectAllies = new AffectAllies({
        affect: function(ally) {
            self.potion.affect;
        },

        allies: player.allies;
    });
}

// you can now create a mass healing potion:
var potion = new MassHealingPotion({
    weight: 50,
    someProp: "someValue",
    someOtherProp: "someOtherValue"
    // and so on and so forth with whatever properties you want the potion to have
});

嗯,结果比我想象的要长一些,可能包含比我想要的更多的错误,但我希望这能传达构图的基本概念。

现在,更简单的对象创建甚至不是组合的最佳部分,也就是说您可以重复使用不同的行为。考虑一下你有一把神奇的剑,无论何时你进行攻击它都能治愈你的盟友。你要做的只是给它治疗成员和AffectAllies成员和繁荣 - 治愈好友的神奇剑。有了继承,你必须在Magical Items类中创建一个Swords类(然后你会有两个不同的Swords类 - 一个用于非魔法剑,另一个用于魔法剑!Ew!),然后通过Healing延伸剑等,等等。

你可以选择任何方式,继承或对象组合。两者对你想要达到的目标同样有效。

但是性能呢?

200件30件物品一件?不是问题。将它们全部放在一个巨大的阵列/物体中,煮沸,捣碎,炖炖。浏览器不关心。不过,你最好的选择可能是一个对象:

var itemList = {
    bigSword: new BigSword(...);
    smallSword: new SmallSword(...);
}

答案 1 :(得分:2)

我更喜欢物体。我将从一个简单的通用“Item”开始,然后通过{inherited'从具有prototyping的泛型项构建特定项。

这可能会减少代码冗余并显着提高可维护性。

Speedwise我没有线索,但我认为迭代200 * 30数组值并不是那么快。

答案 2 :(得分:2)

您需要先做一个认真的设计工作。如果你刚刚开始编码(正如许多开发人员所做的那样),你只会到目前为止并意识到你的设计存在根本缺陷,应用程序需要重写。这在早期阶段并不重要,但是一旦你编写了几百行代码就会变得非常繁琐。

无论如何都要将代码编写到原型中,但是你应该从中得到的只是设计提示,代码应该被抛弃。

您的商品列表(或商品目录)应该是一个对象,其中包含添加,删除和更新商品的方法。然后每个玩家(角色,头像,等等)只需要他们的物品和状态列表。应该有全局更新伤害或健康或任何能够获得特定类型物品的功能并将其应用于特定类型的玩家(例如武器伤害敌人,食物使玩家和朋友恢复等等)。

只有了解了所有玩家和项目及其属性和动作后,才能开始设计接口和方法,最后编写一些代码。

密切关注目标,即开发引人入胜的游戏,而不只是写几千行代码。