Почему стрелочную функцию нельзя использовать как конструктор в JavaScript
Что проверяют
Знаете ли вы, что делает new, и понимаете ли, чем стрелочная функция отличается от обычной по устройству.
Как отвечать
Потому что у стрелочной функции нет внутреннего метода [[Construct]], а именно его вызывает оператор new. Вызов new Arrow() даёт TypeError: Arrow is not a constructor.
Что делает new у обычной функции: создаёт пустой объект, связывает его с prototype функции, вызывает функцию с этим объектом в качестве this и возвращает его. Стрелочная функция не поддерживает ни один шаг:
- у неё нет собственного
this. Он берётся лексически из области, где функция объявлена, и переопределить его нельзя ни черезnew, ни черезcall,applyилиbind; - у неё нет свойства
prototype, поэтому связывать создаваемый объект не с чем.
Заодно у стрелочных функций нет собственного arguments (используют остаточные параметры), нет super, и они не могут быть генераторами.
Из этого следуют практические правила:
- колбэки удобнее стрелочными:
thisне теряется, и привязка не нужна; - методы объекта обычными: в стрелочной
thisукажет не на объект, а на внешнюю область; - поля класса стрелочными, если метод передаётся как обработчик: привязка получается сама, без
bindв конструкторе; - конструкторы и методы прототипа только обычными функциями или классами.
Полезно упомянуть и обратное: класс тоже нельзя вызвать без new, потому что у него нет обычного вызова, только конструирование.
Где спотыкаются
Объясняют запрет только отсутствием this, не упоминая отсутствие prototype.
Пытаются привязать this стрелочной функции через bind.
Пишут метод объекта стрелочной функцией и удивляются, что this не тот.
Не знают, что у стрелочной функции нет arguments.