Я пытаюсь вызвать функцию averageScore()
, объявленную в моем классе Player
, из моего класса Leaderboard
, но получаю ошибку ссылки.
Перетаскивание кода из моего класса Player
в консоль работает нормально, но когда я пытаюсь вызвать его из Leaderboard
, я получаю Reference error: add_score is undefined
.
Вот мой класс игрока:
class Player {
constructor(player_id, score) {
this.player_id = player_id;
this.scores = [score];
this.total = score;
//this.average = this.total/this.scores.length;
}
addScore(score) {
this.total += score;
this.scores.push(score);
return score;
}
averageScore() {
return this.scores.length ? this.total / this.scores.length : 0;
}
resetScore() {
this.scores = [];
this.score = 0;
}
};
А вот мой класс лидеров:
class LeaderBoard extends Player {
add_score = (player_id, score) => {
if (!this.player_id) {
var newPlayer = new Player(player_id, score);
this.player_id = newPlayer;
} else {
var average = this.player_id.averageScore();
return average.toFixed(1);
}
};
/*...(additional functions and closing bracket excluded)*/
Я ожидал, что AverageScore будет отображаться, когда add_score вызывает его, но вместо этого я получаю справочную ошибку - есть идеи?
У меня нет веской причины, почему, хотя я предполагаю, что это не нужно? Кроме того, могу ли я вложить класс Player в таблицу лидеров? Не уверен, что лучший подход
то, что вы закодировали, выглядит совершенно неправильно, если честно ... почему LeaderBoard, предположительно, список игроков, расширяет Player? и почему вы установили this.player_id ... который является идентификатором в конструкторе Player, чтобы он был экземпляром Player? Код имеет очень мало смысла
Кроме того, единственная ошибка, которую я получаю с вашим кодом, это this.player_id.averageScore
, если я создаю экземпляр LeaderBoard с такими аргументами, как new LeaderBoard (1,2), а затем пытаюсь добавить_score - никогда не получаю ошибку, которую вы получаете
Я думал, что мне понадобится extends Player
, чтобы иметь доступ к функциям в Player
нет, вам нужно создать экземпляр Player для доступа к функциям в конкретном объекте player
и об этом позаботились var newPlayer = new Player...
верно?
нет, потому что в вашей таблице лидеров всегда будет только один игрок ... это не то, что я делаю из фразы «таблица лидеров» :p
хммм... интересно... addScore
в Player и add_score
в LeaderBoard... вы показали куда/как вы звоните add_score
- может вместо этого должно быть addScore
?
Вы используете стрелочная функция вместо того, чтобы определять его как обычно. Вот код, который следует использовать для класса LeaderBoard
:
class LeaderBoard extends Player {
add_score(player_id, score) { //THIS LINE IS WHERE YOU WENT WRONG
if (!this.player_id) {
var newPlayer = new Player(player_id, score);
this.player_id = newPlayer;
} else {
var average = this.player_id.averageScore();
return average.toFixed(1);
}
};
/*...(additional functions and closing bracket excluded)*/
версия со стрелкой работает так же, как и без стрелки в моем тестировании
В моем это работает только после того, как я изменю стрелку на нестрелку
Я предполагаю, что OP использует babel с включенной предустановкой stage-3, иначе ошибка была бы совершенно другой.
Для LeaderBoard нет смысла расширять Player, так как LeaderBoard будет содержать список Players
См. код ниже для рабочего примера
class Player {
constructor(player_id, score) {
this.player_id = player_id;
this.scores = [score];
this.total = score;
//this.average = this.total/this.scores.length;
}
addScore(score) {
this.total += score;
this.scores.push(score);
return score;
}
averageScore() {
return this.scores.length ? this.total / this.scores.length : 0;
}
resetScore() {
this.scores = [];
this.score = 0;
}
};
class LeaderBoard {
constructor() {
this.players = {};
}
addScore(player_id, score) {
if (!this.players[player_id]) {
this.players[player_id] = new Player(player_id, score);
} else {
this.players[player_id].addScore(score);
}
var average = this.players[player_id].averageScore();
return average.toFixed(1);
}
};
let x = new LeaderBoard();
console.info(x.addScore(1, 1)); // avg is 1 / 1 === 1
console.info(x.addScore(1, 3)); // avg is (1 + 3) / 2 === 2
console.info(x.addScore(1, 5)); // avg is (1 + 3 + 5) / 3 === 3
console.info(x.addScore(2, 7)); // avg for player 2 is 7 / 1 === 7
почему вы объявляете
add_score
свойством класса в LeaderBoard?