10-08-24 09:50:41
Наследование позволяет одному классу, называемому подклассом или производным классом, наследовать свойства и методы другого класса, называемого суперклассом или базовым классом. Это позволяет разработчикам создавать более специфические классы на основе общих классов, уменьшая дублирование кода и улучшая поддерживаемость.
В JavaScript класс может наследовать от другого класса с помощью ключевого слова extends. Подкласс затем может вызвать конструктор суперкласса с помощью ключевого слова super, что обеспечивает правильную инициализацию родительского класса.
// Суперкласс
class Animal {
constructor(name) {
this.name = name;
}
// Метод для описания животного
describe() {
console.log(`${this.name} - это животное.`);
}
}
// Подкласс
class Dog extends Animal {
constructor(name, breed) {
super(name); // Вызов конструктора суперкласса
this.breed = breed;
}
// Метод, специфичный для подкласса Dog
bark() {
console.log(`${this.name} лает!`);
}
// Переопределение метода describe
describe() {
console.log(`${this.name} - это собака породы ${this.breed}.`);
}
}
// Создание экземпляра класса Dog
const myDog = new Dog('Бадди', 'Золотистый ретривер');
myDog.describe(); // Вывод: Бадди - это собака породы Золотистый ретривер.
myDog.bark(); // Вывод: Бадди лает!
В этом примере класс Dog наследует класс Animal. Класс Dog использует ключевое слово super для вызова конструктора класса Animal, обеспечивая инициализацию свойства name. Класс Dog также определяет собственный метод bark и переопределяет метод describe, чтобы обеспечить специфическую функциональность.
Ключевое слово super используется для вызова функций в родительском классе объекта. Оно часто используется для вызова конструктора суперкласса и может также использоваться для вызова методов суперкласса.
class Vehicle {
constructor(type) {
this.type = type;
}
start() {
console.log(`Запуск ${this.type}`);
}
}
class Car extends Vehicle {
constructor(make, model) {
super('автомобиль'); // Вызов конструктора суперкласса
this.make = make;
this.model = model;
}
start() {
super.start(); // Вызов метода start из Vehicle
console.log(`Автомобиль ${this.make} ${this.model} готов к движению!`);
}
}
const myCar = new Car('Toyota', 'Corolla');
myCar.start();
// Вывод:
// Запуск автомобиль
// Автомобиль Toyota Corolla готов к движению!
В этом примере класс Car расширяет класс Vehicle. Конструктор класса Car вызывает super('автомобиль'), чтобы передать параметр type конструктору Vehicle. Метод start в Car вызывает метод start класса Vehicle с помощью super.start() перед выполнением собственной логики.
Подкласс может наследовать методы от суперкласса и переопределять их, чтобы предоставить специфические реализации. Когда метод переопределен, метод подкласса используется вместо метода суперкласса при вызове на экземпляре подкласса.
class Bird {
fly() {
console.log('Эта птица может летать.');
}
}
class Penguin extends Bird {
fly() {
console.log('Пингвины не могут летать.');
}
}
const penguin = new Penguin();
penguin.fly(); // Вывод: Пингвины не могут летать.
В этом примере класс Penguin переопределяет метод fly класса Bird, чтобы указать, что пингвины не могут летать.