Выбор ответа Middle this, call, apply, bind обновлено

Поле-стрелка против метода класса

Вопрос

Какое утверждение о handle в каждом варианте верно?

class A { handle() { return this; } }
class B { handle = () => this; }

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: У B своя handle в каждом экземпляре и не теряет this, у A одна в прототипе. Поле класса создаётся в конструкторе на каждом экземпляре, а стрелка берёт this из конструктора, то есть экземпляр.

Варианты ответа

  1. Оба handle лежат в прототипе и общие для всех экземпляров своего класса
  2. У B своя handle в каждом экземпляре и не теряет this, у A одна в прототипеправильный ответ
  3. A.prototype.handle и B.prototype.handle одинаково не теряют this при отрыве
  4. Поле-стрелку нельзя переопределить в наследнике, поэтому B нельзя наследовать

Разбор

Поле класса создаётся в конструкторе на каждом экземпляре, а стрелка берёт this из конструктора, то есть экземпляр. Поэтому const h = b.handle; h() вернёт экземпляр. Метод A.handle лежит в прототипе один на всех и при отрыве теряет this. У B в прототипе handle нет вовсе. Наследовать B можно, но поле наследника перезапишет поле родителя, и super.handle() из наследника вызвать не получится: в прототипе родителя такого метода нет.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.