Javascript 构造函数总是函数对象吗?

Javascript 构造函数总是函数对象吗?,javascript,Javascript,我正在阅读最新的ECMA-262参考资料,2011年6月5.1版 在表9节中,我们就[[建造]]内部财产: 创建一个对象。通过新操作符调用。这个 SpecOp的参数是传递给 新接线员。实现此内部方法的对象 它们被称为构造函数 标准没有规定构造函数必须是函数对象。那么我们可以有一个不是函数对象的构造函数对象吗 答案非常简单。说: Constructor 创建和初始化对象的函数对象。 因此,根据定义,只有函数可以是构造函数。但是,很可能有一些主机对象的行为类似于构造函数,它们没有本机函数对象的任何其

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

在表9节中,我们就[[建造]]内部财产:

创建一个对象。通过新操作符调用。这个 SpecOp的参数是传递给 新接线员。实现此内部方法的对象 它们被称为构造函数

标准没有规定构造函数必须是函数对象。那么我们可以有一个不是函数对象的构造函数对象吗


答案非常简单。说:

Constructor
创建和初始化对象的函数对象。

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

虽然定义了术语“构造函数”(如@RobG),但没有任何东西可以阻止非“构造函数”对象具有
[[Construct]]
方法

这有点令人困惑。这意味着您可以在不是
函数
的对象上使用
运算符(因此根据 ),但确实提供了一个
[[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
返回
“function”
,即使
java.lang.String
不是函数。根据要添加到Pumbaa80的(它是一个具有
[[Call]]]
方法的主机对象)

,这是正确的(这对于注释来说太长了)

当执行函数的
构造
时,必须执行其
调用
操作(但它没有说明在执行非函数对象的
构造
时必须执行什么操作),从而增加了混淆。现在,实现
call
的对象可以根据需要调用函数对象

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


因此,如果我得到了正确的答案,非函数对象可以有一个
构造
方法和一个
调用
方法
java.lang.String
就是这样一个例子。

你能链接到规范文档吗?如果没有你提供的报价更全面的背景,我想很多人都无法回答。(尽管这是一个有趣的问题!)您可能会对ECMA-262 5.1标准PDF的HTML转换感兴趣。如果我没记错的话,Crockford说一般来说,在JSF中使用构造函数不是一个好的模式,你实际上是在阅读规范。。。太好了。@Thepoosh Crockford还声称++运算符在JS中不是一个好的模式……我接受这个答案。IMHO规范并不完全清楚,因为似乎不是函数的对象仍然可以具有[[Construct]]内部属性,至少问题中引用的表9没有明确禁止这一点。如果有人知道规范的作者是谁,我想给他写封电子邮件,要求澄清。接下来,你会迷失在“什么是函数?”的语义中。该规范仅涵盖本机对象(包括内置对象),并明确允许宿主对象执行其喜欢的操作。宿主对象的创建者遵循ECMA-262是有道理的,但在很多情况下,他们没有,很高兴看到一个不符合ECMA-262的示例。IE:-)@RobG不确定您在这里想说什么。在一定程度上覆盖主体对象。此外,术语“函数”在@RobG中定义,我认为问题在于规范不完全一致。@Pumbaa80您引用的部分说,
主机对象**可以**支持这些内部属性**任何依赖于实现的行为**…
,并且对该行为几乎没有限制。此外,还有许多可调用的主机对象不符合函数的ECMAScript概念(例如,它们不是函数的实例)。这确实有点令人困惑。我认为该规范的作者非常了解当前的实现,并为这些实现做了精确的定义,故意允许像“可调用的主机对象不是函数”这样的奇怪组合。