我正在阅读最新的 ECMA-262 参考资料,2011 年 6 月 5.1 版。
在第8.6.2节的表 9 中,我们有关于 [[Construct]] 内部属性的内容:
创建一个对象。通过 new 运算符调用。SpecOp 的参数是传递给 new 运算符的参数。实现此内部方法的对象称为构造函数。
该标准并没有说构造函数必须是 Function 对象。那么我们可以有一个不是函数对象的构造函数对象吗?
我正在阅读最新的 ECMA-262 参考资料,2011 年 6 月 5.1 版。
在第8.6.2节的表 9 中,我们有关于 [[Construct]] 内部属性的内容:
创建一个对象。通过 new 运算符调用。SpecOp 的参数是传递给 new 运算符的参数。实现此内部方法的对象称为构造函数。
该标准并没有说构造函数必须是 Function 对象。那么我们可以有一个不是函数对象的构造函数对象吗?
答案非常简单。ES5 § 4.3.4说:
Constructor
Function object that creates and initialises objects.
所以你有了它,根据定义,只有一个 Function 可以是一个构造函数。但是,很可能有一些宿主对象的行为类似于构造函数,它们不具有本机 Function 对象的任何其他属性(例如,IE 中的原始 XMLHttpRequest 对象在 ActiveX 中实现)。
虽然定义了术语“构造函数”(正如@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
请注意,即使typeof java.lang.String
返回不是函数。根据11.4.3这是正确的(它是带有方法的宿主对象)"function"
java.lang.String
[[Call]]