Как вывести в консоль информацию об объектах

Подскажите как вывести в консоль информацию о песне и подкасте, это тема связана с полиморфизмом. Задание вроде легкое, но не пойму как правильно записать код в // выведите в консоль информацию о песне/подкасте.

Необходимо описать функцию с параметром audioList, который будет массивом. Циклом forEach проходим по массиву и вызываем на каждом объекте метод получения информации согласно его типу: getSongInfo или getEpisodeInfo.

class AudioItem {
  constructor(title, artist) {
    this._title = title;
    this._artist = artist;
    this.isLiked = false;
  }

  like() {
    this.isLiked = !this.isLiked;
  }
}

class Song extends AudioItem {
  constructor(title, artist, releaseYear) {
    super(title, artist);
    this._releaseYear = releaseYear;
  }

  getSongInfo() {
    return `${this._artist} - ${this._title} (${this._releaseYear})`
  }
}

class PodcastEpisode extends AudioItem {
  constructor(title, artist, guest, duration) {
    super(title, artist);
    this._guest = guest;
    this._duration = duration;
  }

  getEpisodeInfo() {
    return `${this._artist}. "${this._title}" - ${this._guest} (${this._getFormattedDuration()} сек.)`;
  }

  _getFormattedDuration() {
    const minutes = Math.floor(this._duration / 60); // целое количество минут
    const seconds = this._duration % 60; // остаток от деления на 60
    return `${minutes}:${seconds > 9 ?  seconds : '0' + seconds}`;
  }
}

const song1 = new Song("Tendinitis", "Jason Richardson");
const song2 = new Song("All I Want", "A Day To Remember");
const episode1 = new PodcastEpisode("Одинокий пират", "ЧКГ PODCAST", "Кирилл Сиэтлов", 4987);
const episode2 = new PodcastEpisode("Один день", "Заварили бизнес", null, 1915);

const list = [song1, episode1, song2, episode2];

function getAudioInfo(audioList) {
  audioList.forEach((audioItem) => {
    if (audioItem.getSongInfo) {
      // выведите в консоль информацию о песне
    } else if (audioItem.getEpisodeInfo) {
      // выведите в консоль информацию о подкасте
    }
  });
} 

getAudioInfo(list);


Ответы (1 шт):

Автор решения: Павел Ериков

Можно в базовом классе создать функцию getInfo(){}, а в функциях наследниках переопределять эту функцию.

Вот простейший пример:

class AudioItem {
  constructor(title, artist) {
    this._title = title;
    this._artist = artist;
    this.isLiked = false;
  }

  like() {
    this.isLiked = !this.isLiked;
  }
  
  getInfo(){}
}

class Song extends AudioItem {
  constructor(title, artist, releaseYear) {
    super(title, artist);
    this._releaseYear = releaseYear;
  }
  //Переопределяем функцию
  getInfo() {
    return `${this._artist} - ${this._title} (${this._releaseYear})`
  }
}

class PodcastEpisode extends AudioItem {
  constructor(title, artist, guest, duration) {
    super(title, artist);
    this._guest = guest;
    this._duration = duration;
  }
  //Переопределяем функцию
  getInfo() {
    return `${this._artist}. "${this._title}" - ${this._guest} (${this._getFormattedDuration()} сек.)`;
  }

  _getFormattedDuration() {
    const minutes = Math.floor(this._duration / 60); // целое количество минут
    const seconds = this._duration % 60; // остаток от деления на 60
    return `${minutes}:${seconds > 9 ?  seconds : '0' + seconds}`;
  }
}

const song1 = new Song("Tendinitis", "Jason Richardson", 2016);
const song2 = new Song("All I Want", "A Day To Remember", 2010);
const episode1 = new PodcastEpisode("Одинокий пират", "ЧКГ PODCAST", "Кирилл Сиэтлов", 4987);
const episode2 = new PodcastEpisode("Один день", "Заварили бизнес", null, 1915);

const list = [song1, episode1, song2, episode2];

function getAudioInfo(audioList) {
  audioList.forEach((audioItem) => {
    //Выводим информацию о каждом элементе
    console.log(audioItem.getInfo());
  });
} 

getAudioInfo(list);

P.S. вы забыли передавать в конструктор Song год, я добавил :)

→ Ссылка