7.1 Основы наследования
Наследование классов в JavaScript позволяет создавать новые классы на основе уже существующих, переиспользуя и расширяя их функциональность. Это ключевой аспект объектно-ориентированного программирования (ООП), который позволяет создавать иерархии классов и управлять поведением объектов.
Для наследования классов используется ключевое слово extends. Класс, который наследует другой класс, называется производным классом (subclass), а класс, от которого производится наследование, называется базовым классом (superclass).
Пример:
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name} makes a noise.`);
}
}
class Dog extends Animal {
speak() {
console.log(`${this.name} barks.`);
}
}
const dog = new Dog('Rex');
dog.speak(); // "Rex barks."
Объяснение:
- Класс
Animalявляется базовым классом с конструктором и методомspeak() - Класс
DogнаследуетAnimalи переопределяет методspeak() - Экземпляр
dogклассаDogиспользует переопределенный методspeak()
7.2 Ключевое слово super
Ключевое слово super используется для вызова конструктора или методов базового класса из производного класса.
1. Вызов конструктора базового класса
Производный класс должен вызвать конструктор базового класса с использованием super() перед использованием this.
Пример:
Конструктор Dog вызывает super(name), чтобы инициализировать свойство name базового класса Animal.
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name} makes a noise.`);
}
}
class Dog extends Animal {
constructor(name, breed) {
super(name);
this.breed = breed;
}
speak() {
console.log(`${this.name} barks.`);
}
}
const dog = new Dog('Rex', 'Labrador');
console.log(dog.name); // "Rex"
console.log(dog.breed); // "Labrador"
dog.speak(); // "Rex barks."
2. Вызов методов базового класса
Методы базового класса могут быть вызваны из производного класса с использованием super.
Пример:
Метод speak() класса Dog вызывает метод speak() базового класса Animal с использованием super.speak(), а затем выполняет собственную логику.
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name} makes a noise.`);
}
}
class Dog extends Animal {
speak() {
super.speak(); // Вызов метода базового класса
console.log(`${this.name} barks.`);
}
}
const dog = new Dog('Rex');
dog.speak();
// "Rex makes a noise."
// "Rex barks."
7.3 Наследование и переопределение методов
Наследование позволяет производным классам переопределять методы базового класса. Это дает возможность изменять или расширять функциональность методов.
Пример:
Метод speak() класса Dog переопределяет метод speak() базового класса Animal, предоставляя собственную реализацию.
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name} makes a noise.`);
}
}
class Dog extends Animal {
speak() {
console.log(`${this.name} barks.`);
}
}
const animal = new Animal('Generic Animal');
animal.speak(); // "Generic Animal makes a noise."
const dog = new Dog('Rex');
dog.speak(); // "Rex barks."
7.4 Наследование и дополнительные методы
Производный класс может добавлять новые методы, которые не существуют в базовом классе.
Пример:
Класс Dog добавляет новый метод fetch(), который не существует в базовом классе Animal.
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name} makes a noise.`);
}
}
class Dog extends Animal {
speak() {
console.log(`${this.name} barks.`);
}
fetch() {
console.log(`${this.name} is fetching.`);
}
}
const dog = new Dog('Rex');
dog.speak(); // "Rex barks."
dog.fetch(); // "Rex is fetching."
7.5 Проверка наследования
Для проверки наследования можно использовать оператор instanceof и метод isPrototypeOf().
Пример:
Оператор instanceof проверяет, является ли объект экземпляром класса. Метод isPrototypeOf() проверяет, является ли прототип объекта частью цепочки прототипов другого объекта.
console.log(dog instanceof Dog); // true
console.log(dog instanceof Animal); // true
console.log(Animal.prototype.isPrototypeOf(Dog.prototype)); // true
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ