Повторение: возможно ли для объекта X вернуть true
для IsConstructor(X)
, но false
для IsCallable(X)
? Т.е. возможно ли, чтобы объект X имел внутренний метод [[Construct]]
, но не имел внутреннего метода [[Call]]
?
Спецификация ECMAScript не настолько ясна в этом вопросе, как могла бы быть.
(1)
6.1.7.2 «Внутренние методы объекта и внутренние слоты» говорит:
A объект функции - это объект, который поддерживает внутренний метод [[Call]]. конструктор (также называемый функция конструктора ) - это функциональный объект, который поддерживает внутренний метод [[Construct]].
Из этого можно сделать вывод, что если такой объект X существует , он явно не является «функциональным объектом» и, следовательно, также не «конструктором». То есть IsConstuctor(X)
вернул бы true
для объекта, который не считается «конструктором», что было бы странным.
(2)
Обратите внимание, что в предложении, которое определяет IsConstructor
, в преамбуле говорится, что она определяет, является ли ее аргумент «функциональным объектом с внутренним методом [[Construct]]», но алгоритм не имеет явной проверки, что аргумент функциональный объект. Это говорит о том, что (по мнению автора спецификации) наличия внутреннего метода [[Construct]] достаточно, чтобы гарантировать, что аргумент является функциональным объектом, то есть у него есть внутренний метод [[Call]].
* 1 033 * (3)
Единственный смысл иметь внутренний метод
[[Construct]]
- это вызывать его в
абстрактной операции Construct
. Как и в пункте (2), в преамбуле говорится, что операция «используется для вызова внутреннего метода [[Construct]] объекта функции», но алгоритм явно не проверяет, является ли
F
объектом функции.
Так что я полагаю, что ответ таков: хотя спецификация явно не говорит, что такие объекты не могут существовать, это довольно сильно подразумевает / предполагает, что они не существуют.
ОБНОВЛЕНИЕ (2018-05-22):
6.1.7.2 «Внутренние методы объекта и внутренние слоты» теперь изменено и теперь (выделено мной):
A объект функции - это объект, который поддерживает внутренний метод [[Call]]. Конструктор - это объект, который поддерживает внутренний метод [[Construct]]. Каждый объект, который поддерживает [[Construct]], должен поддерживать [[Call]] ; то есть каждый конструктор должен быть функциональным объектом. Следовательно, конструктор также может называться функцией конструктора или объектом функции конструктора .