Наследование классов в 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 — это и есть переопределение методов и свойств.
Когда нужно наследование
- Поскольку дочерний класс может наследовать все функциональные возможности родительского класса, это позволяет повторно использовать код.
- Разработав функциональность, вы можете просто унаследовать ее. Нет необходимости изобретать колесо. Это позволяет сделать код чище и проще в обслуживании.
- Поскольку в дочерний класс можно добавлять собственные функциональные возможности, можно наследовать только полезные функции и определять другие необходимые функции.