Вопрос проверяет понимание различий между стрелочными и обычными функциями в JavaScript, а именно отсутствие у стрелочных функций собственного контекста this и невозможности их использования с оператором new.
Стрелочные функции в JavaScript были введены в стандарте ES6 как более лаконичный синтаксис для написания функций. Однако они имеют принципиальные отличия от обычных функций, одно из которых — невозможность использования в качестве конструктора.
Стрелочные функции не имеют собственного контекста this. Вместо этого они захватывают значение this из окружающей лексической области видимости (то есть из того места, где функция была определена). Когда вы вызываете функцию с оператором new, JavaScript создает новый пустой объект и связывает его с this внутри функции. Поскольку стрелочная функция не может иметь собственного this, этот механизм нарушается.
У стрелочных функций нет свойства prototype. Обычные функции, используемые как конструкторы, имеют свойство prototype, которое содержит методы и свойства, наследуемые экземплярами. Без prototype стрелочная функция не может передавать методы создаваемым объектам.
// Обычная функция-конструктор работает
function RegularConstructor(name) {
this.name = name;
}
const obj1 = new RegularConstructor('Alice');
console.log(obj1.name); // Alice
// Стрелочная функция не может быть конструктором
const ArrowConstructor = (name) => {
this.name = name;
};
// const obj2 = new ArrowConstructor('Bob'); // TypeError: ArrowConstructor is not a constructor
// Проверка наличия prototype
console.log(RegularConstructor.prototype); // {constructor: ƒ}
console.log(ArrowConstructor.prototype); // undefinedСтрелочные функции предназначены для кратких выражений и сохранения контекста this из внешней области. Их не следует использовать там, где требуется создание новых объектов с помощью new. Для конструкторов всегда применяйте обычные функции или классы.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию