Массив представляет наиболее простой способ определения набора данных. Но иногда базовых возможностей массивов может быть недсотаточно. Например, определим массив, который представляет некоторую команду:
const team = ["Tom", "Sam", "Bob"]; for(const person of team) { console.log(person); }
Но что, если мы хотим добавить к команде какие-то дополнительные атрибуты - имя тренера, страну или город, где базируется команда, название, какие-то другие признаки? На первый взгляд, мы можем определить сложный объект:
const team = { name: "Barcelona", // название members: ["Tom", "Sam", "Bob"] // игроки }; for(const person of team.members) { console.log(person); }
Но есть и другое решение, которое позволяет нам определить свой тип коллекции: создать свой класс, который будет унаследован от Array.
class Team extends Array{ constructor(name, ...members){ super(...members); this.name = name; } }
Здесь мы предполагаем, что в качестве первого параметра конструктора класса выступает имя команды, а в качестве второго - набор игроков команды, число которых не фиксировано.
Благодаря наследованию от Array мы можем рассматривать объекты класса Team как наборы данных и применять к ним все те операции, которые применяются к массивам:
class Team extends Array{ constructor(name, ...members){ super(...members); this.name = name; } } // создаем объект команды const barcelona = new Team("Barcelona", "Tom", "Sam", "Bob"); console.log(barcelona); // Team(3) ["Tom", "Sam", "Bob"] // перебор набора for(const person of barcelona) { console.log(person); } barcelona.push("Tim"); // добавим один элемент console.log(barcelona); // Team(4) ["Tom", "Sam", "Bob", "Tim"] barcelona.splice(1, 1); // удалим второй элемент console.log(barcelona); // Team(3) ["Tom", "Bob", "Tim"]
Как и в общем при наследоваании м можем переопределять унаследованные методы. Например, переопределим поведение метода добавления push(), который отвечает за добавление в конец массива:
class Team extends Array{ constructor(name, ...members){ super(...members); this.name = name; } push(person){ if(person !== "admin") super.push(person); } } const snowbars = new Team("SnowBars", "Tom", "Sam", "Bob"); snowbars.push("admin"); // добавим один элемент - admin console.log(snowbars); // Team(3) ["Tom", "Sam", "Bob"] snowbars.push("Tim"); // добавим один элемент - Tim console.log(snowbars); // Team(4) ["Tom", "Sam", "Bob", "Tim"]
В данном случае если в метод передано любое имя, кроме "admin", то оно добавляется в команду.