Наследование классов в 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 — это и есть переопределение методов и свойств.

Когда нужно наследование

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

СodeСhick.io - простой и эффективный способ изучения программирования.

2024 ©