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

时间:2016-02-02 19:12:32

标签: javascript ecmascript-6

我有一个类玩家,并希望扩展它以拥有一个类Team。

我的逻辑是:

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();

小提琴:http://www.es6fiddle.net/ik5s7ale/

但这会产生错误而且课程不起作用。我理解在循环中调用super是错误的,但这里的解决方案是什么?这两个类之间的关系不是“扩展”情况,我是否应该使用/声明为此而不扩展的单独类?

2 个答案:

答案 0 :(得分:2)

这不是超类子类的情况。

如果您有一个类X,并且想要创建一个特殊的增强版X,那么您应该扩展/子类化它。这不是你的情况;您应该使用Team撰写 Player类。

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);
  }
}

如果您希望玩家能够访问Team方法或常量,则必须为Player个实例提供对其父Team实例的引用,并调用它为team.teamMethod()

答案 1 :(得分:1)

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

团队不是玩家的特例,而是团队由玩家组成。

正确的是宣布单独的课程。您有两种实现方式,取决于您的使用方式

  • Team在构造函数的参数中获取一系列玩家 - 这在大多数情况下都很好。

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

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

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

parant对象只有一个,super不返回指向它的指针(而是返回undefined),所以你不能将它推送到数组。

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

See an updated fiddle

修改 我正在写答案,并没有注意到同时发布的另一个答案: - )