Чтобы проверить является ли функция [конструкторной][constructor], нужно посмотреть есть ли у нее поле [[Construct]]
. Нет ни единого варианта проверить это [напрямую][isconstructor].
Но есть два способа, которые мне известны:
- Проверить поля, которые мы можем просмотреть с помощью кода js (быстрее).
- Проверить поле
[[Construct]]
, используя интерфейсы, которые это делают (медленнее).
К первому типу относится реализация prototype.js
, ко второму newTarget.js
, bind.js
, proxy.js
и reflect.js
.
Также существует одна весомая разница; при проверке в newTarget.js
, bind.js
, proxy.js
и reflect.js
мы используем [[Construct]]
поле, которое вызывается через операцию [Construct][construct-op] для создания объекта, чтобы убедиться, что объект создан, тем самым это докажет, что функция является конструкторной, но в этом и опасность если произойдет ошибка в алгоритме [[Construct]]
проверяемая функция не пройдет проверку.
- [[[Construct]]][builtin-Construct] для встроенных функций (пример: [Objec