Наследование классов в JS
В этой статье вы познакомитесь с наследованием классов в JavaScript.
Наследование позволяет определить класс со всеми функциональными возможности родительского класса и добавить при этом новые возможности.
С помощью наследования классы могут «наследовать» все свойства и методы другого класса.
Наследование позволяет удобно переиспользовать код.
Чтобы использовать наследование классов, нужно использовать ключевое слово extends
. Например:
// родительский класс
class Person {
constructor(name) {
this.name = name;
}
greet() {
console.log(`Привет, ${this.name}`);
}
}
// наследуем родительский класс
class Student extends Person {
}
let student1 = new Student('Андрей');
student1.greet(); // Вывод: Привет, Андрей
Как вы видите, класс Student
наследует все методы и свойства класса Person
. Это значит, что у класса Student будет свойство name
и метод greet()
— как у класса Person
.
В программе мы создали объект student1
класса Student
и использовали его метод greet()
.
Ключевое слово super()
Ключевое слово super()
используется внутри дочернего класса. Оно отсылает к родительскому класса. Например:
// родительский класс
class Person {
constructor(name) {
this.name = name;
}
greet() {
console.log(`Привет, ${this.name}`);
}
}
// наследуем родительский класс
class Student extends Person {
constructor(name) {
console.log("Создаем класс Student");
// вызываем конструктор класса super и передаем параметр name
super(name);
}
}
let student1 = new Student('Андрей');
student1.greet(); // Вывод: Привет, Андрей
Как вы видите, super()
внутри класса Student
относится к классу Person
. Следовательно, когда вызывается конструктор класса Student
, он также вызывает конструктор класса Person
, который присваивает ему свойство name
.
Переопределение методов и свойств
Если у дочернего класса есть метод или свойство с таким же именем, что и у родительского класса, использоваться будет метод или свойство дочернего класса. Такое использование наследования называется переопределением методов и свойств (overriding). Например:
// родительский класс
class Person {
constructor(name) {
this.name = name;
this.occupation = "безработный";
}
greet() {
console.log(`Привет, ${this.name}.`);
}
}
// наследуем родительский класс
class Student extends Person {
constructor(name) {
// вызываем конструктор класса super и передаем параметр name
super(name);
// переопределяем свойство occupation
this.occupation = 'студент';
}
// переопределяем метод класса Person
greet() {
console.log(`Привет, студент ${this.name}.`);
console.log('Твой род деятельности: ' + this.occupation);
}
}
let p = new Student('Андрей');
p.greet();
Вывод
Привет, студент Андрей.
Твой род дятельности: студент
Как вы видите, свойство occupation
и метод greet()
существует одновременно и в родительском классе Person
и в дочернем классе Student
. Но используются определения свойства и метода дочернего класса Student
— это и есть переопределение методов и свойств.
Когда нужно наследование
- Поскольку дочерний класс может наследовать все функциональные возможности родительского класса, это позволяет повторно использовать код.
- Разработав функциональность, вы можете просто унаследовать ее. Нет необходимости изобретать колесо. Это позволяет сделать код чище и проще в обслуживании.
- Поскольку в дочерний класс можно добавлять собственные функциональные возможности, можно наследовать только полезные функции и определять другие необходимые функции.