我有一个类玩家,并希望扩展它以拥有一个类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();
但这会产生错误而且课程不起作用。我理解在循环中调用super
是错误的,但这里的解决方案是什么?这两个类之间的关系不是“扩展”情况,我是否应该使用/声明为此而不扩展的单独类?
答案 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),所以你不能将它推送到数组。
你的代码中也有一些拼写错误。
修改强> 我正在写答案,并没有注意到同时发布的另一个答案: - )