Javascript 是否存在IsCallable为false但IsConstructor为true的JS对象?

Javascript 是否存在IsCallable为false但IsConstructor为true的JS对象?,javascript,function,constructor,language-lawyer,Javascript,Function,Constructor,Language Lawyer,ECMAScript规范函数在其参数具有[[Call]]内部方法时返回true。规范中有几个地方使用了它,例如在的定义中 有一个类似的规范函数,当其参数具有[[Construct]]内部方法时返回true 一些JS对象,包括大多数内置函数,如escape,是可调用的,但不可构造是否有可构造但不可调用的功能? 请注意,当作为普通函数调用时,用户定义的类和内置类都会抛出TypeError,但根据IsCallable的定义仍然可以调用,这可以通过查看Array.prototype.toString是否

ECMAScript规范函数在其参数具有[[Call]]内部方法时返回true。规范中有几个地方使用了它,例如在的定义中

有一个类似的规范函数,当其参数具有[[Construct]]内部方法时返回true

一些JS对象,包括大多数内置函数,如
escape
,是可调用的,但不可构造是否有可构造但不可调用的功能?

请注意,当作为普通函数调用时,用户定义的类和内置类都会抛出
TypeError
,但根据IsCallable的定义仍然可以调用,这可以通过查看Array.prototype.toString是否会尝试将它们用作
join
的实现来确定:

/{}不可调用,因此toString返回Object.prototype.toString:

log('null:',Array.prototype.toString.apply({join:{}))不,不可能创建可构造但不可调用的东西。规范中定义[[Construct]]的所有内容都是函数,但代理除外,代理只有在其目标也有[[Construct]]时才有()

如果代理外来对象的[[ProxyTarget]]内部插槽的初始值是具有[[Construct]]内部方法的对象,则代理外来对象仅具有[[Construct]]内部方法


重述:对于
IsConstructor(X)
,对象X是否可能返回
true
,而对于
IsCallable(X)
,对象X是否可能返回
false
?也就是说,对象X是否可能有
[[Construct]]
内部方法,但没有
[[Call]]]
内部方法

ECMAScript规范在这一点上并不像可能的那样明确

(一) 说:

函数对象是支持[[Call]]内部方法的对象。构造函数(也称为构造函数函数)是支持[[Construct]]内部方法的函数对象

由此我们可以得出结论,如果这样的对象X确实存在,那么它显然不是“函数对象”,因此也不是“构造函数”。也就是说,
IsConstuctor(X)
将为不被视为“构造函数”的对象返回
true
,这将是奇怪的

(二) 请注意,在定义
IsConstructor
的子句中,序言说明它确定其参数是否“是具有[[Construct]]内部方法的函数对象”,但算法没有明确检查该参数是否为函数对象。这表明(规范编写者认为)拥有[[Construct]]内部方法足以保证参数是函数对象,即它拥有[[Call]]内部方法

(三) 拥有
[[Construct]]
内部方法的唯一一点是在中调用它。与第(2)点类似,序言中说该操作“用于调用函数对象的[[Construct]]内部方法”,但该算法没有明确检查
F
是否为函数对象

所以我相信答案是,虽然规范没有明确指出这样的对象不存在,但它相当强烈地暗示/假设它们不存在


更新(2018-05-22):

现在修改为(强调我的):

函数对象是支持[[Call]]内部方法的对象。构造函数是支持[[Construct]]内部方法的对象每个支持[[Construct]]的对象都必须支持[[Call]];也就是说,每个构造函数都必须是函数对象。因此,构造函数也可以称为构造函数函数或构造函数函数对象

可能的案例:。规范中没有任何东西可以阻止这样一个东西的存在,但这确实非常奇怪。可能是