Наследование массивов

Последнее обновление: 18.08.2021

Массив представляет наиболее простой способ определения набора данных. Но иногда базовых возможностей массивов может быть недсотаточно. Например, определим массив, который представляет некоторую команду:

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", то оно добавляется в команду.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850