通过传递变量引用对象的函数属性

时间:2013-04-27 02:15:06

标签: javascript

我对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语句。谢谢你的帮助。

2 个答案:

答案 0 :(得分:1)

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

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

但是你的对象文字不应该有数字属性名。尝试给他们真正有意义的名字。否则,如果这是您的意图,请改为使用数组:

var abilities = [function() {..}, function() {..}];

答案 1 :(得分: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"

如果您是(面向对象的)编程的新手,here是一个很好的起点。