我正在阅读2011年6月5.1版的最新ECMA-262参考资料.
在第8.6.2节表9中,我们关于[[Construct]]内部属性:
创建一个对象.通过new运算符调用.SpecOp的参数是传递给new运算符的参数.实现此内部方法的对象称为构造函数.
该标准并未说明构造函数必须是Function对象.那么我们可以有一个不是函数对象的构造函数对象吗?
虽然定义了术语“构造函数”(正如 @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]]