【问题标题】:Change many parent properties without writing them all out更改许多父属性而不将它们全部写出来
【发布时间】:2021-02-18 16:28:39
【问题描述】:

有没有办法让我将 Warrior.stats 中的值与 Character.stats 中的值相关联,而无需为每个角色实例编写以下内容?

this.level = 4,
this.vitality = 11,
etc...

换句话说,始终将 CharacterChild.stats 写为数字数组。

class Character {
    constructor(name, sex, gift, physique, stats) {
        this.name = name;
        this.sex = sex;
        this.gift = gift;
        this.physique = physique;
        this.stats = ['level', 
                      'vitality', 
                      'attunement', 
                      'endurance', 
                      'strength', 
                      'dexterity', 
                      'resistance', 
                      'intellegence', 
                      'faith', 
                      'humanity']
    }
}
class Warrior extends Character {
    constructor(name, sex, gift, physique, stats){
        super(name, sex, gift, physique, stats)
        this.stats = [4, 11, 8, 12, 13, 13, 11, 9, 9]
    }
 }

let dave = new Warrior('pla','ce','hold','er')
return dave.stats.level
//4

【问题讨论】:

    标签: javascript object inheritance


    【解决方案1】:

    使用休息和传播:

    class Warrior extends Character {
        constructor(...args) {
            super(...args);
    

    另一种选择是对this.stats 使用类字段并完全省略构造函数(super 将被自动调用,其参数与调用子类时使用的参数相同):

    class Warrior extends Character {
        stats = [4, 11, 8, 12, 13, 13, 11, 9, 9]
    }
    

    【讨论】:

    • 这些都不起作用,我在底部添加了一行来澄清。我希望能够使用warrior.stats.level从战士类中检索统计数据
    • 超类和子类中的stats 属性是一个数组,而不是一个对象,所以this.stats.level 不起作用。而是分配一个对象? stats = { level: 4, vitality: 11, 等?
    【解决方案2】:

    替换这一行:

    this.stats = [4, 11, 8, 12, 13, 13, 11, 9, 9]
    

    这会覆盖您的 stats 属性名称数组,如下所示:

    [4, 11, 8, 12, 13, 13, 11, 9, 9].forEach((val, i) => {
      this[this.stats[i]] = val;
    });
    

    这将产生所需的结果:

    this.level = 4, this.vitality = 11, ..., this.humanity = 9
    

    class Character {
      constructor(name, sex, gift, physique, stats) {
        this.name = name;
        this.sex = sex;
        this.gift = gift;
        this.physique = physique;
        this.stats = ['level',
          'vitality',
          'attunement',
          'endurance',
          'strength',
          'dexterity',
          'resistance',
          'intellegence',
          'faith',
          'humanity'
        ]
      }
    }
    class Warrior extends Character {
      constructor(name, sex, gift, physique, stats) {
        super(name, sex, gift, physique, stats);
        
        // map values to stats names
        [4, 11, 8, 12, 13, 13, 11, 9, 9]
          .forEach((val, i) => {
            this[this.stats[i]] = val;
        });
      }
    }
    
    let dave = new Warrior('pla', 'ce', 'hold', 'er')
    console.log(dave);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-10
      • 1970-01-01
      • 1970-01-01
      • 2019-05-07
      相关资源
      最近更新 更多