Javascript JS类子类在访问父构造函数时返回未定义
在子类中调用Javascript JS类子类在访问父构造函数时返回未定义,javascript,class,constructor,Javascript,Class,Constructor,在子类中调用rnd.winner()时,我得到了未定义的值。这应该从父级(如JOHN)返回玩家的名称。从子级调用测试函数将从父级返回正确的win()。在child中调用super.constructor.name作为返回状态返回父类名称->player为什么 职业玩家{ 建造师(姓名){ this.name=名称; 这是0.win=0; 这1.0损失=0; }; 赢(){ 把这个还给我; }; 损失(){ 退还此项损失; }; }; 班级记分牌延伸球员{ 建造师(轮){ 超级(); 这个圆=圆
rnd.winner()
时,我得到了未定义的值。这应该从父级(如JOHN)返回玩家的名称。从子级调用测试函数将从父级返回正确的win()
。在child中调用super.constructor.name
作为返回状态返回父类名称->player
为什么
职业玩家{
建造师(姓名){
this.name=名称;
这是0.win=0;
这1.0损失=0;
};
赢(){
把这个还给我;
};
损失(){
退还此项损失;
};
};
班级记分牌延伸球员{
建造师(轮){
超级();
这个圆=圆;
这个标志=0;
};
添加(){
返回this.round.push([…this.round].pop()+1);
}
优胜者(){
返回super.name;
};
失败者(){
返回super.constructor.name;
};
徽章(){
归还这个徽章;
};
测试(){
return super.win();
};
};
让plr=新玩家(“约翰”),
rnd=新记分板([0]);
log(plr.name,rnd.winner(),rnd.test())代码>
在child中调用super.constructor.name
作为返回状态返回父类名称(player
)。为什么呢
因为这就是超级代码所做的。它不接受自己的构造函数
属性,而是继承对象的构造函数
属性。对于scoreBoard.prototype
方法,这是player.prototype
对象,其.constructor.name
是“player”
没有理由使用super
,除非您正在覆盖继承的方法(或构造函数)。这意味着永远不要对普通数据属性使用super
。它们始终存在于当前实例上。改用此..
在子类中调用rnd.winner()
时,我得到了undefined
值。这应该从父级(如JOHN)返回玩家的名称
这是因为.name
没有初始化,因为您的子类没有将参数传递给super()
中的父构造函数。事实上,您的rnd
根本不知道plr
实例
无论如何,用继承来描述球员和记分牌之间的关系似乎是错误的e、 g.记分板,其中包含一组要显示的玩家对象。不要使用带有普通数据属性的super
。它们始终存在于当前实例上。改用这个。名字
。为什么你觉得记分牌
是玩家
的延伸?我真的不懂逻辑。对于记分牌(采用赢家和输家的方法),你至少需要两名球员,因此我无法得到你在继承关系中所希望的结果。为什么round
是数组constructor.name
与您的name
属性无关。它是函数的预定义属性(因为构造函数是一个函数)
(在我看来完全不正确的内容)并返回此名称。name
它最终返回正确的名称。现在我明白了,我会努力找到一个好方法来处理这件事!是的,这是一种让它发挥作用的方法,是的,这是完全错误的,因为记分牌不是球员。