0

我对 JavaScript 和一般编程非常陌生。这个问题是在 RPG 的背景下进行的。我在战斗函数中有一个角色对象,试图根据 a) 预定义的角色类和 b) 输入调用能力函数:

// player example
var player = {
  this.pClass = 0; // denotes character class; could also be 1 or 2
}  

// ability list
var ability = {
  // first character class
  0: {
    1: function() {some action;},
    2: function() {some other action;}
  },
  // second character class
  1: {
  // same deal here
  }
};

var input = prompt("Enter an action number:");

我希望能够通过传递玩家类和选定的数字来调用该操作,例如:

ability.{player.pClass}.{input}();

我是否以正确的方式处理这个问题?如果可能的话,我不希望if...else if为每个选项迭代语句。感谢您的帮助。

4

2 回答 2

1

您可以使用方括号访问对象的属性:

var abilities = {
    fireball: function() { ... }
};

abilities["fireball"];
abilities.fireball; // equivalent, but only if the index is a valid js identifier

虽然您可以使用数字索引,但我建议采用更面向对象的方式:

// define what a player is and can do
var Player = function(pClass) {
    this.pClass= pClass;
};

Player.prototype.useAbility = function(name) {
    if (this.pClass.abilities[name]) { // make sure this player can use the ability
        this.pClass.abilities[name]();
    }
};

// define what a class is
var PClass = function(name) {
    this.name = name;
    this.abilities = {};
};

// define "mage" class
PClass.mage = new PClass("mage");
PClass.mage.abilities["fireball"] = function() { ... }
PClass.mage.abilities["hex"] = function() { ... }

PClass.warrior = new PClass("warrior");
PClass.warrior.abilities["riposte"] = function() { ... }

// create a new player
var bartTheFearsome = new Player(PClass.mage);
bartTheFearsome.useAbility("fireball");
bartTheFearsome.useAbility(prompt("enter ability name")); // enter "fireball" or "hex"

如果您不熟悉(面向对象)编程,这里是一个很好的起点。

于 2013-04-27T02:36:11.417 回答
1

使用方括号表示法允许动态访问属性名称:

ability[player.pClass][input]();

但是您的对象文字不应具有数字属性名称。试着给他们真正有意义的名字。否则,如果这是您想要的,请改用数组:

var abilities = [function() {..}, function() {..}];
于 2013-04-27T02:18:01.507 回答