Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
尝试使用面向对象的javascript建模_Javascript_Oop - Fatal编程技术网

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

尝试使用面向对象的javascript建模,javascript,oop,Javascript,Oop,我对整个面向对象的范例非常陌生 我试图在一个特定的游戏中塑造一个角色,你有不同的等级,职业,和很多的装备选择等等 我最终的目标是创建一个“化妆台”,玩家可以在这里打开网站,试穿一些装备,看看它如何影响他们的参数,花费多少,等等 我已经对主要部分进行了编程(),但这是我第一次使用html、css和javascript,目前这一切都一团糟。 这次我想好好开始:) 假设我们要模拟的角色有一个对象: var Lord = function(){ this.Level = 1;

我对整个面向对象的范例非常陌生

我试图在一个特定的游戏中塑造一个角色,你有不同的等级,职业,和很多的装备选择等等

我最终的目标是创建一个“化妆台”,玩家可以在这里打开网站,试穿一些装备,看看它如何影响他们的参数,花费多少,等等

我已经对主要部分进行了编程(),但这是我第一次使用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
    };
};
我的问题是: 一个骑士一开始有一个防御和一个士气,不同的派系会给你不同的属性提升。无法重新分配这些值。 玩家在升级时还可以获得一些属性值,用于不同的参数,这些属性值可以重新分配

此外,玩家可能会装备一些能够提升属性的装备,而这些装备也不能重新分配(只能通过取消装备)

我之前所做的是,我创建了一大堆数组,所有数组的索引都对应于每个参数,每个数组表示不同派别的默认属性提升、装备的总属性提升以及玩家手动分配的属性。 然后,我对每个索引求和,得到要显示的最终参数数组。玩家只能在第三个阵列中重新分配点,而不能在任何其他阵列中重新分配点

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

我读过一些基本概念(封装、继承、多态性),但它们相当抽象,当我开始认真研究时,我真的不知道该怎么做:s

-

-


响应


这条领带很难用

好的,我将尝试从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);
那么在上帝的目标上,我会

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

    this.Defense = function(){
        return this.Faction.Defense + this.someOtherClass.Defense;
    }

我希望通过使用


感谢大家的贡献:)

您可以让统计值成为方法而不是成员变量。这样,您可以在调用过程中计算给定的属性,例如knight.defense()。反过来,角色类中的方法defence()可以从派系类调用defence(),从装备集类调用defence(),等等。这样做的好处是你可以在任何时候添加额外的属性修饰符,例如,如果你决定要一个额外的系统或其他东西

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

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

附录:Pluto的答案也是如何获得可重用的“类”(而不是单个对象)。如前所述,我还将派系设置为一个类,而不仅仅是一个字符串(您可以使用instanceof键入check):


例如。

如果需要,您可以保留阵列。面向对象编程最重要的一点是封装,它可以归结为提供一种与角色对象交互的方法,而无需了解任何关于底层实现的信息。您想要处理对象,而不是数组或哈希表(即使在它们下面,对象实际上就是这样构建的!),您想要的是编写如下代码:

var link = Knight();
link.equip(new MasterSword());
alert(link.getAttackPoints());

呃,@qternion有点抢先了我一步。所以我把这个答案变成了一个维基!让我们在这个问题上释放SO的智慧。

只需将Lord更改为函数(即,
var Lord=function(){/*current code*/}
),并将其属性设置为
this.Level=1。从现在起,您可以像大多数面向对象编程语言一样,使用
newlord()
创建任意数量的Lord

实践中的一个例子

var Lord = function() {

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

    /* ... */

    this.addParameter=function(Parameter, amount){
        this[Parameter] += amount;
    };

    /* ... */
};
var a=new Lord();
var b=new Lord();

一个骑士以1个防御开始
-所以在你的对象文字中将其设置为1<代码>防御:0,
=>
防御:1,
本着希望提高Javascript OO技能的精神,你可能还想看看这篇关于原型函数的文章:因为你对面向对象编程是绝对陌生的,我强烈建议你阅读以下关于为什么原型继承很重要的博客文章:谢谢你的资源:)好吧,也许我会改成这个,我计划在设备上使用这个符号等等,这里只有一个字符可供使用,所以我使用了文字符号,但我对itok不太熟悉,等等,因为我将在呈现防御方法之前计算防御方法,所以我可以使用防御方法的返回值,而不是计算它,将其分配给防御属性,然后使用该属性本身?我想我现在开始有点明白了:染料,就这样。如果你出于某种原因想要缓存返回值,你只需要手动分配返回值(例如,你可能有临时的属性修改,并且你想缓存角色的基本防御以进行其他检查)。嗯,我很快就会编辑它,以便它在我上面的第一篇文章中可见,但是现在,每个派系都有一个对象,每个派系的每个参数都有相应的属性。然后它变得有点笨拙D:啊,忘了上面的,我刚刚意识到我可以制作一个派系对象,然后让每个派系都是该对象的一个实例!谢谢,我想我现在对这一点有了更坚定的把握:啊,你可以在更合适的地方传播修饰语。例如,如果一个给定的角色有一个派系修饰符(由派系.防御()提供)和一个装备修饰符,可能还有一些临时状态修饰符,那么所有这些都将添加到角色中
var Lord = function() {

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

    /* ... */

    this.addParameter=function(Parameter, amount){
        this[Parameter] += amount;
    };

    /* ... */
};
var a=new Lord();
var b=new Lord();