Класс против функции-конструктора
Вопрос
Чем класс отличается от функции-конструктора, если под капотом всё равно прототипы?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Класс нельзя вызвать без `new`, функцию-конструктор можно
Тело класса всегда в строгом режиме
Объявление класса в TDZ, функция поднимается целиком
Методы класса неперечисляемые
`extends` и `super` настраивают цепочку и наследование статики, плюс наследование встроенных типов вроде `Array` и `Error`
Есть поля, приватные `#`-члены и статические блоки
Что могут спросить следом
- Почему в наследнике нельзя использовать
thisдоsuper()? - Как наследоваться от
Errorи зачем это нужно? - Где лежат поля класса: в экземпляре или в прототипе?
Разбор
Образцовый ответ: «Модель та же: typeof класса это function, методы лежат в prototype. Но отличий немало. Класс нельзя вызвать без new, будет TypeError, а старый конструктор при таком вызове молча писал бы поля в глобальный объект. Тело класса всегда строгое. Объявление класса не поднимается так, как функция: до объявления он в временной мёртвой зоне. Методы класса создаются неперечисляемыми, их не видно в for...in. extends делает две связи: прототип экземпляров и прототип самого класса, поэтому наследуется и статика. Через extends корректно наследуются встроенные типы, Error, Array, Map: объект создаёт родительский конструктор, и именно поэтому this в наследнике недоступен до super(). Плюс синтаксис, которого нет у функций: поля экземпляра, которые создаются в каждом объекте, приватные поля с решёткой, геттеры, статические поля и блоки».
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.