尝试使用面向对象的javascript进行建模

Syl*_*lin 8 javascript oop

我对整个面向对象的范例都很陌生.

我试图在某个游戏中模拟角色,你有不同的等级,类和许多设备选择等.

我最终的目标是创造一种某种类型的"梳妆台",让玩家可以打开网站,尝试一些装备,看看它如何影响他们的参数,花费多少等等.

我已经有了编程的主要部分(这里),但这是我用html,css和javascript进行的第一部作品,而且现在只是一大堆.我想这次开始正常:)


假设我有一个我们将要模拟的角色的对象:

var Lord = function(){

    this.Level =       1;
    this.Gender =      'Male';
    this.Faction =     'Knight';

    this.Attack =      0;
    this.Defense =     1;
    this.SpellPower =  0;
    this.Knowledge =   0;
    this.Luck =        0;
    this.Morale =      1;
    this.Initiative =  0;

    this.addParameter = function(Parameter, amount){
        this[Parameter] += amount;
    };
    this.changeLevelTo = function(Level){
        this.Level = Level;
    };
    this.changeGenderTo = function(Gender){
        this.Gender = Gender;
    };
    this.changeFactionTo = function(Faction){
        this.Faction = Faction;
        //adjust default stats based on new faction
    };
};
Run Code Online (Sandbox Code Playgroud)

我的问题是这样的:一个骑士开始时有1个防御和1个士气,不同的派系会给你不同的统计提升.无法重新分配这些值.在练级时,玩家还可以获得一些在不同参数上花费的统计点,这些可以重新分配.

此外,玩家可以装备一些提供统计提升的设备,并且这些设备也不能重新分配(仅通过不加分配).

我之前做过的是我创建了一大堆数组,所有数组的索引都对应于每个参数,每个数组代表不同派系的默认stat提升,设备的总统计提升以及玩家分配的统计数据手动.然后我将每个索引求和,以给我一个最终的参数数组来显示.然后,玩家只能重新分配第3个阵列中的点,而不能重新分配任何其他阵列.

我应该如何使用面向对象的编程来实现它?

我已经阅读了一些基本概念(封装,继承,多态)但它们相当抽象,当我开始讨论它时,我真的不知道该怎么做:s

-

-


回应


这个网站很难使用:o

好的,我会试着看看我能从qternion的回答得到什么:

var Faction = function(atk, def, sp, kn, luk, mor, ini){
    this.Attack =      atk;
    this.Defense =     def;
    this.SpellPower =  sp;
    this.Knowledge =   kn;
    this.Luck =        luk;
    this.Morale =      mor;
    this.Initiative =  ini;
}

var Knight = new Faction(0,1,0,0,0,1,0);
var Wizard = new Faction(0,0,0,1,0,1,0);
Run Code Online (Sandbox Code Playgroud)

然后在主的对象上,我会

    //this.Faction = 'Knight'
    this.Faction = Knight

    this.Defense = function(){
        return this.Faction.Defense + this.someOtherClass.Defense;
    }
Run Code Online (Sandbox Code Playgroud)

我将使用http://javascript.crockford.com/prototypal.html寻求使用原型改进上述内容

感谢所有人的贡献:)

qte*_*ion 2

您可以将统计值设置为方法而不是成员变量。这样,您就可以在调用期间计算给定的统计数据,例如 Knight.defense()。反过来,角色类中的 Defense() 方法可以从派系类中调用 Defense() ,从 EquipmentSet 类中调用 Defense() 等。这样做的好处是,您可以随时添加额外的统计修饰符,例如,如果您决定你想要一个额外津贴系统什么的。

然后,每个派系类别都可以覆盖其修饰符的 Defense() 函数。

我不会称这是最面向对象的方式,但作为一名 Javascript 程序员,我自己就是这样做的。

附录:Pluto 的答案也是如何获得可重用的“类”(而不是单个对象)。如前所述,我还将 Faction 设为一个类,而不仅仅是一个字符串(您可以使用 instanceof 进行类型检查):

var Faction = function (){
    this.prototype.defense = function () { return this.Defense; };
    this.prototype.initStats = function () { this.Defense = 0;};
    this.initStats(this);
};

var Knight = new Faction ();
Knight.prototype.initStats = function () { this.Defense = 1;};
Run Code Online (Sandbox Code Playgroud)

例如。