--- sidebar_position: 2 --- # Наследование классов Наследование классов – это способ расширения одного класса другим классом. Таким образом, мы можем добавить новый функционал к уже существующему. 1. Чтобы унаследовать от класса: class Child extends Parent: -При этом Child.prototype.__proto__ будет равен Parent.prototype, так что методы будут унаследованы. 2. При переопределении конструктора: - Обязателен вызов конструктора родителя super() в конструкторе Child до обращения к this. 3. При переопределении другого метода: - Мы можем вызвать super.method() в методе Child для обращения к методу родителя Parent. 4. Внутренние детали: - Методы запоминают свой объект во внутреннем свойстве [[HomeObject]]. Благодаря этому работает super, он в его прототипе ищет родительские методы. - Поэтому копировать метод, использующий super, между разными объектами небезопасно. - У стрелочных функций нет своего this и super, поэтому они «прозрачно» встраиваются во внешний контекст. ## Ключевое слово «extends» Синтаксис создания класса допускает указывать после extends не только класс, но и любое выражение. Пример вызова функции, которая генерирует родительский класс: ```js function f(phrase) { return class { sayHi() { alert(phrase); } }; } class User extends f("Привет") {} new User().sayHi(); // Привет ``` Здесь class User наследует от результата вызова f("Привет"). ## Переопределение методов ```js class Rabbit extends Animal { stop() { // ...теперь это будет использоваться для rabbit.stop() // вместо stop() из класса Animal } } ``` У классов есть ключевое слово "super", чтобы сделать новый на его основе, изменяя или расширяя его функциональность super.method(...) вызывает родительский метод. super(...) для вызова родительского конструктора (работает только внутри нашего конструктора).