通过'new'为对象提供多个属性?

时间:2013-08-28 08:10:44

标签: javascript

有没有办法以简单的方式提供多个属性?例如,我试图这样做:

object = new Spell( 50, 30, 5, 1, 30, 10 );
object = new Buff( "Armor", 50, 5 );

function Spell( baseDmg, dmgPerLvl, cd, cdPerLvl, cost, costPerLvl ) { 
this.baseDmg = baseDmg;
//...
//etc
// base damage, damage per level, cooldown, cooldown per level, cost, cost per level
}

function Buff( type, amount, duration );
this.type = type;
//etc
}

现在这只是两个例子,但如果我想给一个对象提供许多“属性”,我该怎么做呢?我这样做的方法删除了以前的新Spell属性,并只给出了Buff属性。有没有办法像我上面写的那样,无需手动编写极长的数组?

在有人说代码不可读之前,这可能是真的,我把它完全用excel编写,而且它非常容易阅读,我只需复制粘贴所有法术。如果可能的话,我宁愿坚持使用这种方法。

非常感谢您对此事的任何帮助,谢谢您提前。

编辑:

感谢你指着我正确的Blender方向,我找到了一些有用的资料。以下解决方案是一个好的解决方案还是你说我有更好的方法来做到这一点?

object = new Spell( 50, 30, 5, 1, 30, 10 );
Spell.prototype.extendBuff = function( baseCC, ccPerLvl, ccText ) {
        this.baseCC = baseCC;
    this.ccPerLvl = ccPerLvl;
    this.ccText = ccText;
}
object.extendBuff( "Armor", 50, 5 );

1 个答案:

答案 0 :(得分:3)

您将需要以某种方式复杂的对象,这是我最喜欢的使用OOP和继承的方式。

var Hero = function(name) {
    this.buffs = [];
    this.debuffs = [];
};
Hero.prototype = {
    cast: function(spell, target) {
        if(spell && spell.contructor === Buff) this.buffs.push(spell);
        // etc etc
    }
}

var Spell = function() { /* .... */};
var Buff = function() {
    Spell.apply(this, arguments);
}
Buff.prototype = Object.create(Spell.prototype, {
                constructor: {
                    value: Buff,
                    enumerable: false,
                    writable: true,
                    configurable: true
                }
            });
Buff.prototype.buffType = function() {}; //make sure this is after the Object.create line or it will get overriden

///////

var hero = new Hero('name');
hero.cast(new Spell('attack'), 'enemy');
hero.cast(new Buff('heal'), 'self');