6

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

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

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

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

根据要求链接到标准

4

3 回答 3

4

答案非常简单。ES5 § 4.3.4说:

Constructor Function object that creates and initialises objects.

所以你有了它,根据定义,只有一个 Function 可以是一个构造函数。但是,很可能有一些宿主对象的行为类似于构造函数,它们不具有本机 Function 对象的任何其他属性(例如,IE 中的原始 XMLHttpRequest 对象在 ActiveX 中实现)。

于 2012-05-01T06:58:47.207 回答
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

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

于 2012-05-01T09:05:00.727 回答
0

添加到 Pumbaa80 的答案(这对于评论来说太长了)。

混淆增加了13.2.2,根据它,当一个函数 construct被执行时,它的call操作必须被执行(但它没有说明当construct一个不是函数的对象被执行时必须做什么)。现在,根据9.11call实现的对象是可调用的函数对象。

同样根据4.2 “函数是可调用对象”。但这当然并不意味着每个可调用对象都是一个函数。

因此,如果我得到这个正确的非函数对象可以有一个Construct方法,也可以有一个Call方法。java.lang.String就是这样一个例子。

于 2012-05-01T20:38:28.603 回答