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

Javascript 通过传递变量引用对象的函数属性,javascript,Javascript,我对JavaScript和一般编程非常陌生。这个问题是在RPG的背景下提出的。我在战斗函数中有一个角色对象,试图根据a)预定义的角色类和b)输入调用能力函数: 我希望能够通过传递玩家类别和所选号码来调用操作,例如: ability.{player.pClass}.{input}(); 我是否以正确的方式处理这件事?如果可能的话,我不想对每个选项重复if…else if语句。感谢您的帮助。使用方括号表示法允许动态访问属性名称: ability[player.pClass][input]();

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

我希望能够通过传递玩家类别和所选号码来调用操作,例如:

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

我是否以正确的方式处理这件事?如果可能的话,我不想对每个选项重复
if…else if
语句。感谢您的帮助。

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

ability[player.pClass][input]();
但是对象文字不应该有数字属性名。试着给他们起个真正有意义的名字。否则,如果这是您想要的,请改用数组:

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

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

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"

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

我建议您从这里开始学习JavaScript。你似乎对基本语法和概念有一些误解…@elclanrs:毫无疑问。这个项目主要是自学JavaScript。谢谢你的推荐。是的,我希望我第一次启动xD时有这个链接。谢谢。我不确定该采取哪种方法,因此这有助于澄清问题。但是,您的初始响应是否也有效?按名称而不是数字列表引用的优点是什么?@RobRosson它更有意义。您的代码可以很好地处理数字名称,但如果您在对象文字上使用它们,这可能是一个迹象,表明您可以在没有数字名称的情况下使用它们。感谢您提供的参考链接。到目前为止,Mozilla网站提供了很大的帮助。我喜欢你设计一个更面向文本的游戏,但我的方法最终是点击一个按钮来选择一个动作,在这种情况下,引用的名称并不重要。不过,我可能会在其他地方使用这个替代方案。再次感谢。名字主要对程序员很重要。一周后,你不会记得“0”代表“法师”,“1”代表“战士”<代码>类法师能力[“火球”]是描述性的<代码>能力[0][1]不是。
// 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"