JS类子在访问父构造函数时返回undefined

时间:2017-07-03 19:44:20

标签: javascript class constructor

在子类中调用rnd.winner()时,我得到了未定义的值。这应该像JOHN一样从父母那里返回玩家的名字。从子级调用测试函数会从父级返回正确的win()值。在子项中调用super.constructor.name作为返回状态会返回父类名 - > player现在为什么会这样?

class player {
  constructor(name) {
    this.name = name;
    this.win = 0;
    this.loss = 0;
  };
  win() {
    return this.win;
  };
  loss() {
    return this.loss;
  };
};

class scoreBoard extends player {
  constructor(round) {
    super();
    this.round = round;
    this.emblem = 0;
  };
  add() {
    return this.round.push([...this.round].pop() + 1);
  }
  winner() {
    return super.name;
  };
  loser() {
    return super.constructor.name;
  };
  emblem() {
    return this.emblem;
  };
  test() {
    return super.win();
  };
};
let plr = new player("JOHN"),
  rnd = new scoreBoard([0]);
console.log(plr.name, rnd.winner(), rnd.test());

1 个答案:

答案 0 :(得分:0)

  

在child中调用super.constructor.name作为返回状态返回父类名(player)。那为什么呢?

因为那是super所做的。它不接受自己的constructor属性,而是继承自的对象上的constructor属性。对于scoreBoard.prototype方法,player.prototype对象是.constructor.name"player"super

除非您覆盖继承的方法(或构造函数),否则没有理由使用super。这意味着永远不要将this.…与普通数据属性一起使用。它们始终存在于您当前的实例中。请改用undefined

  

我在子类中调用rnd.winner()时获得.name值。这应该从像JOHN这样的父母那里返回玩家的名字。

那是因为super()没有初始化,因为你的子类没有将参数传递给rnd中的父构造函数。实际上,您的plr根本不了解{{1}}个实例。

在任何情况下,继承似乎都是描述玩家和记分牌之间关系的错误工具。 Use composition instead - 例如记分牌上有一系列球员对象可供展示。