在子类中调用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());
答案 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 - 例如记分牌上有一系列球员对象可供展示。