构造函数总是一个函数对象吗?

Rol*_*and 6 javascript

我正在阅读2011年6月5.1版的最新ECMA-262参考资料.

在第8.6.2节表9中,我们关于[[Construct]]内部属性:

创建一个对象.通过new运算符调用.SpecOp的参数是传递给new运算符的参数.实现此内部方法的对象称为构造函数.

该标准并未说明构造函数必须是Function对象.那么我们可以有一个不是函数对象的构造函数对象吗?

根据要求链接到标准

use*_*621 3

虽然定义了术语“构造函数”(正如 @RobG指出的那样),但没有什么可以阻止非“构造函数”对象拥有方法[[Construct]]

这有点令人困惑。这意味着您可以new在不是 a 的对象上使用运算符(因此不是4.3.4Function中的“构造函数” ),但确实提供了方法。[[Construct]]

请注意,没有一个标准对象符合这一条件,但主机对象确实可以。浏览器插件(例如 Java)可能会公开一些对象,如下所示:

new java.lang.String(); // it works, so java.lang.String has a [[Construct]] method
java.lang.String instanceof Function // false
Object.prototype.toString.call(java.lang.String).indexOf('Function') // -1
Run Code Online (Sandbox Code Playgroud)

请注意,即使typeof java.lang.String返回不是函数。根据11.4.3这是正确的(它是一个带有方法的宿主对象)"function"java.lang.String[[Call]]