Javascript ES6类扩展另一个类并多次调用super?

Javascript ES6类扩展另一个类并多次调用super?,javascript,ecmascript-6,Javascript,Ecmascript 6,我有一个一流的球员,我想把它扩展成一个一流的球队 我的逻辑是: class Player { constructor(name, age) { //class constructor this.name = name; this.age = age; } sayName() { //class method console.log('Hi, I am ', this.name + '.'); } sayAge() { console.log(

我有一个一流的球员,我想把它扩展成一个一流的球队

我的逻辑是:

class Player {
  constructor(name, age) { //class constructor
    this.name = name;
    this.age = age;
  }

  sayName() { //class method
    console.log('Hi, I am ', this.name + '.');
  }
  sayAge() {
    console.log('Hi, I am ', this.age + '.');
  }
}

class Team extends Player {
  constructor(members) {
    var players = [];
    for (var i = 0; i < members; i++) {
      players.push(super(members[i].name, members[i].age));

    }
    this.players = players; // to not call "this" before super
  }

  teamNames() { 
    console.log(this.players);
  }
}

let p = new Player('John', 25);
p.sayName(); // John

var team = [{
  name: 'Jonh',
  age: 25
},{
  name: 'Anna',
  age: 27
}];
var A_Team = new Team(team);
A_Team.temNames();
职业玩家{
构造函数(名称、年龄){//类构造函数
this.name=名称;
这个。年龄=年龄;
}
sayName(){//class方法
log('你好,我是',this.name+');
}
sayAge(){
log('Hi,我是',this.age+');
}
}
班队队员{
建造师(成员){
var=[];
对于(变量i=0;i
小提琴:
但是这会产生错误,并且类不起作用。我知道在循环中调用
super
是错误的,但这里的解决方案是什么?这两个类之间的关系是否不是“扩展”情况,我是否应该为此使用/声明分离类而不进行扩展?

这不是超类-子类情况

如果您有一个类X,并且您想要创建一个特殊的、增强的X版本,那么您应该对它进行扩展/子类化。你的情况不是这样的;您只需使用
Player
类组成
Team
类即可

class Player {
  constructor(name, age, team) { //class constructor
    this.name = name;
    this.age = age;
    this.team = team;
  }
  sayName() { //class method
    console.log('Hi, I am ', this.name + '.');
  }
  sayAge() {
    console.log('Hi, I am ', this.age + '.');
  }
}

class Team {
  constructor(members) {
    this.players = [];
    for (var i = 0; i < members; i++) {
      this.players.push(new Player(members[i].name, members[i].age, this));
    }
  }
  teamNames() { 
    console.log(this.players);
  }
}
职业玩家{
构造函数(姓名、年龄、团队){//类构造函数
this.name=名称;
这个。年龄=年龄;
这个团队=团队;
}
sayName(){//class方法
log('你好,我是',this.name+');
}
sayAge(){
log('Hi,我是',this.age+');
}
}
班队{
建造师(成员){
这个.players=[];
对于(变量i=0;i

如果您想让玩家有权访问
Team
方法或常量,您必须给
Player
实例一个对其父
Team
实例的引用,并将其称为
Team.teamMethod()

Team和Player之间的关系肯定不是继承

团队不是球员的特例,而是由球员组成的团队

正确的做法是声明单独的类。你有两种方法来实现它,这取决于你是如何使用它的

  • 团队在构造函数的参数中获取玩家数组-这在大多数情况下都很好

  • 团队被创建为“空”,然后设置玩家。也许团队可以根据一些参数创建该玩家的实例(createPlayer(姓名、年龄)


这是你们问题的最后一部分,为什么你们的代码不起作用

当您调用super时,您正在调用父对象的构造函数

parant对象只有一个,super不返回指向它的指针(而是返回未定义的),因此不能将其推送到数组中

您的代码中也有一些拼写错误

编辑
我正在写答案,同时并没有注意到另一个答案:是的,我不明白球队是如何扩展球员的。难道这支球队不会有一个球员的集合,而不是扩大它吗?就像我认为可能有一些类似于你所拥有的东西会起作用,但我认为这没有意义。如果您已经有了一个玩家类,只需创建一个玩家对象数组。@azium是的,它将是一个集合。但我想在每个球员身上都有一些可以在球队中使用的方法。但也许这只是调用所有收集方法并将它们分开的一种情况当然,您仍然可以调用集合项上的Player方法,因为它们将是Player的实例。请参阅,如果您的团队是Player,那么它应该能够
sayName
sayAge
。如何实现这一点还不太清楚;您必须定义自己的实现。