Наследование массивов
Массив представляет наиболее простой способ определения набора данных. Но иногда базовых возможностей массивов может быть недсотаточно. Например, определим массив, который представляет некоторую команду:
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");
// Team(3) ["Tom", "Sam", "Bob"]
console.log(barcelona);
// перебор набора
for(const person of barcelona) {
console.log(person);
}
// добавим один элемент
barcelona.push("Tim");
// Team(4) ["Tom", "Sam", "Bob", "Tim"]
console.log(barcelona);
// удалим второй элемент
barcelona.splice(1, 1);
// Team(3) ["Tom", "Bob", "Tim"]
console.log(barcelona);
Переопределение методов
Как и в общем при наследоваании м можем переопределять унаследованные методы. Например, переопределим поведение метода добавления 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");
// добавим один элемент - admin
snowbars.push("admin");
// Team(3) ["Tom", "Sam", "Bob"]
console.log(snowbars);
// добавим один элемент - Tim
snowbars.push("Tim");
// Team(4) ["Tom", "Sam", "Bob", "Tim"]
console.log(snowbars);
В данном случае если в метод передано любое имя, кроме admin
, то оно добавляется в команду.