QUESTION: Що таке new.target?
Спеціальна властивість new.target, що з'явилася в стандарті ES6, є потужним інструментом для метапрограмування в JavaScript. Головне завдання цієї властивості — вказувати безпосередньо на той конструктор, який був викликаний із використанням ключового слова new. Якщо функцію або клас було викликано звичайним чином, без оператора new, то значення new.target дорівнюватиме undefined. Ця особливість дає змогу легко визначати, чи був викликаний конструктор коректно, і за потреби примусово викликати його через new або викидати помилку.
Одним із класичних практичних застосувань new.target є реалізація абстрактних класів, які напряму не повинні мати екземплярів. Ви можете написати всередині конструктора базового класу перевірку: якщо new.target дорівнює самому абстрактному класу, слід ініціювати помилку, яка забороняє створення об'єкта напряму, дозволяючи створення екземплярів лише через дочірні класи-нащадки.
Важливо враховувати особливості поведінки new.target усередині різних типів функцій. У звичайних функціях і конструкторах класів він посилається на конструктор, що викликав. Однак у стрілочних функціях власної властивості new.target не існує. Усередині стрілочної функції вона береться із зовнішнього контексту, так само, як і ключове слово this, що робить поведінку передбачуваною під час використання вкладених функцій.