Расширение встроенных классов

07-09-24 12:03:35


Image for the Расширение встроенных классов

Зачем расширять встроенные классы?

Существует несколько причин, по которым может потребоваться расширить встроенные классы:

  • Кастомизация: Возможно, вы захотите добавить дополнительные методы или свойства во встроенные классы, чтобы они лучше подходили для ваших нужд.
  • Повторное использование кода: Наследуя функциональность встроенного класса, вы можете избежать переписывания кода, который уже существует в языке, что сделает ваш код проще и легче в поддержке.
  • Специализированное поведение: Расширение класса позволяет вам специализировать или модифицировать работу встроенного класса без изменения поведения других экземпляров этого же класса.

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

class CustomArray extends Array {
// Новый метод для CustomArray
average() {
if (this.length === 0) return 0;
const sum = this.reduce((acc, val) => acc + val, 0);
return sum / this.length;
}
}

const arr = new CustomArray(10, 20, 30, 40);
console.log(arr.average()); // Вывод: 25
console.log(arr instanceof CustomArray); // Вывод: true
console.log(arr instanceof Array); // Вывод: true

В этом примере CustomArray расширяет встроенный класс Array и добавляет новый метод average(). Этот метод вычисляет среднее значение элементов массива. Новый CustomArray по-прежнему имеет доступ ко всем методам класса Array, таким как reduce(), push() и pop().

Наследование класса Error

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

class ValidationError extends Error {
constructor(message) {
super(message); // Вызов конструктора родительского класса
this.name = 'ValidationError'; // Установка имени ошибки
}
}

try {
throw new ValidationError('Некорректный ввод!');
} catch (e) {
console.log(e.name); // Вывод: ValidationError
console.log(e.message); // Вывод: Некорректный ввод!
console.log(e instanceof ValidationError); // Вывод: true
console.log(e instanceof Error); // Вывод: true
}

Здесь ValidationError расширяет встроенный класс Error. Наследуя Error, мы сохраняем всю функциональность встроенной обработки ошибок в JavaScript, создавая при этом более специфичный тип ошибки, который можно перехватывать и обрабатывать уникальным образом.