Что такое new.target?
Специальное свойство new.target, появившееся в стандарте ES6, представляет собой мощный инструмент для метапрограммирования в JavaScript. Главная задача этого свойства — указывать непосредственно на тот конструктор, который был вызван с использованием ключевого слова new. Если функция или класс были вызваны обычным образом, без оператора new, то значение new.target будет равно undefined. Эта особенность позволяет легко определять, был ли вызван конструктор корректно, и при необходимости принудительно вызывать его через new или выбрасывать ошибку.
Одним из классических практических применений new.target является реализация абстрактных классов, которые напрямую не должны иметь экземпляров. Вы можете написать внутри конструктора базового класса проверку: если new.target равен самому абстрактному классу, следует инициировать ошибку, запрещающую создание объекта напрямую, разрешая создание экземпляров только через дочерние классы-наследники.
Важно учитывать особенности поведения new.target внутри различных типов функций. В обычных функциях и конструкторах классов он ссылается на вызвавший конструктор. Однако в стрелочных функциях собственного свойства new.target не существует. Внутри стрелочной функции оно берется из внешнего контекста, точно так же, как и ключевое слово this, что делает поведение предсказуемым при использовании вложенных функций.