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

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

Coursme
8 мин.
22 янв. 2024

В мире JavaScript наследование массивов предоставляет захватывающую возможность создания собственных типов данных, позволяя расширять функциональности базовых массивов.

Это особенно полезно, когда требуется создать коллекцию данных с дополнительными свойствами или методами.

Давайте рассмотрим, как можно использовать наследование массивов, используя классы в JavaScript, чтобы создавать более гибкие и функциональные структуры данных.

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

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;
   }
}

Теперь мы можем рассматривать объекты класса Team как наборы данных и применять к ним все операции, доступные массивам:

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"]

Таким образом, мы расширяем базовые возможности массивов, создавая собственные типизированные коллекции с дополнительной функциональностью.

Переопределение Методов

При использовании наследования массивов в JavaScript, мы имеем возможность не только добавлять новые свойства и методы, но и изменять поведение унаследованных методов. Рассмотрим этот аспект на примере переопределения метода push(), который отвечает за добавление элементов в конец массива.

class Team extends Array {
   constructor(name, ...members) {
       super(...members);
       this.name = name;
   }
   push(person) {
       // Переопределение метода push()
       if (person !== "admin") {
           super.push(person);
       }
   }
}
// Создаем экземпляр класса Team
const snowbars = new Team("SnowBars", "Tom", "Sam", "Bob");
// Добавляем элемент "admin" - не добавится из-за переопределения метода push()
snowbars.push("admin");
console.log(snowbars); // Team(3) ["Tom", "Sam", "Bob"]
// Добавляем элемент "Tim" - добавится, так как не соответствует условию переопределенного push()
snowbars.push("Tim");
console.log(snowbars); // Team(4) ["Tom", "Sam", "Bob", "Tim"]

В данном примере, при вызове метода push() для экземпляра класса Team, он проверяет, равен ли переданный элемент строке "admin". Если не равен, элемент добавляется в массив с использованием унаследованного метода push(). Таким образом, происходит переопределение стандартного поведения метода push().

Заключение

В результате мы видим, что наследование от массивов в JavaScript открывает перед нами новые горизонты в создании типизированных коллекций данных. Мы переходим от обычных массивов к более мощным и удобным структурам, добавляя дополнительные возможности и гибкость. Не только мы можем создавать собственные массивоподобные классы, но и переопределять методы, придавая им желаемое поведение. Этот подход позволяет нам создавать более выразительный и эффективный код для обработки данных в приложениях на JavaScript.

Назад
Следующий тест
Комментарии
Чтобы оставлять комментарии — надо авторизоваться
Комментариев еще нет
Будьте первым
Главная
Курсы
Блог
Меню