Какой метод вызывается при наследовании, если метод определён в прототипе родителя и в экземпляре дочернего класса в JavaScript
Что проверяют
Понимаете ли вы механику поиска свойства по цепочке прототипов и различаете ли собственное свойство экземпляра и метод на прототипе. Формулировка нарочно смешивает эти вещи. Следом просят объяснить, что будет, если родительский конструктор вызовет этот метод сам.
Как отвечать
Правило одно: поиск идёт снизу вверх и останавливается на первом совпадении. Порядок такой: собственные свойства объекта, Child.prototype, Parent.prototype, Object.prototype, дальше null. Значит вызовется вариант из экземпляра дочернего класса: он лежит прямо на объекте и перекрывает всё, что выше.
Дальше самое интересное, откуда берётся метод «в экземпляре». Обычный метод класса method() {} живёт на прототипе, а не на объекте. Собственным свойством экземпляра он становится, если это поле класса (method = () => {}) или присваивание в конструкторе. Поля инициализируются после возврата из super(), отсюда классическая ловушка: если конструктор родителя вызывает this.method(), поле дочернего класса ещё не создано и отработает метод родителя. При переопределении на прототипе наоборот, вызовется дочерняя реализация, потому что this указывает на экземпляр Child.
Полезные детали:
super.method(): ищет не поthis, а в прототипе того объекта, где метод объявлен (слот[[HomeObject]]), поэтому в обычной функции, присвоенной прототипу,superне работает;- проверка:
Object.hasOwn(obj, "method")покажет собственное свойство,Object.getPrototypeOfпройдёт цепочку; - это затенение, а не удаление: родительская реализация на месте и доступна через прототип;
- приватные поля
#xв цепочке не участвуют и из дочернего класса недоступны.
Где спотыкаются
Отвечают «сработает дочерний метод» и на этом останавливаются. Вопрос задан ради объяснения почему, и без цепочки прототипов ответ считают угаданным.
Считают, что методы класса лежат в самом объекте. Отсюда удивление, что Object.keys(obj) их не показывает, а JSON.stringify не сохраняет.
Путают стрелочные поля и обычные методы. Поле создаётся заново на каждом экземпляре и жёстко связывает this, метод на прототипе один на всех, но теряет this при передаче.