构造函数始终是函数对象
Is a constructor always a function object?
我正在阅读最新的 ECMA-262 参考,2011 年 6 月 5.1 版。
在第 8.6.2 节表 9 中,我们有关于 [[构造]] 内部属性:
创建一个对象。 通过新运算符调用。 这 SpecOp 的参数是传递给 新运算符。实现此内部方法的对象 称为构造函数。
该标准并没有说构造函数必须是函数对象。那么我们可以有一个不是函数对象的构造函数对象吗?
根据要求链接到标准
答案非常简单。ES5 § 4.3.4 说:
Constructor
Function object that creates and initialises objects.
所以你有它,根据定义,只有函数可以是构造函数。但是,可能有些主机对象的行为类似于构造函数,而构造函数不具有本机函数对象的任何其他属性(例如,在 ActiveX 中实现的 IE 中的原始 XMLHttpRequest 对象)。
术语"构造函数"(如@RobG指出的那样),但没有什么可以阻止非"构造函数"对象具有[[Construct]]
方法。
这有点令人困惑。这意味着您可以在不是Function
的对象上使用 new
运算符(因此不是 4.3.4 中的"构造函数")),但确实提供了一种[[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
请注意,即使java.lang.String
不是函数,typeof java.lang.String
也会返回"function"
。根据 11.4.3,这是正确的(它是具有 [[Call]]
方法的主机对象)
添加到 Pumbaa80 的答案中(这对于评论来说太长了)。
混淆增加了 13.2.2,根据该 13.2.2,当执行函数的construct
时,必须执行其call
操作(但它没有说明当执行不是函数的对象construct
时必须做什么)。现在,根据 9.11,实现call
的对象是可调用的函数对象。
同样根据 4.2 "函数是一个可调用的对象"。但当然,这并不意味着每个可调用对象都是一个函数。
因此,如果我做对了,非函数对象可以有一个Construct
方法,也可以有一个Call
方法。 java.lang.String
就是这样一个例子。
- 在javascript中调用函数/对象引用时,可容纳任何数据类型
- 访问函数对象的上下文属性|如何
- 为什么可以'我们在函数体中为函数对象添加属性,就像在javascript中为对象文字添加属性一样
- 如何将函数对象从javascript传递到Polymer元素
- 为什么函数对象的实例没有继承函数原型属性
- 为什么我会从 JavaScript 函数返回一个命名函数(对象)
- 为什么实例构造函数指向最上面的函数构造函数对象
- 使用object.freeze()扩展函数对象-can't添加字段
- 为什么'这'与函数对象一起使用时会有不同的处理方式
- setTimeout()/setInterval()赢得't执行**我正在传递函数对象,而不是执行函数
- 为什么茉莉花间谍不't通过引用解析函数对象
- 在 mongo map 中调用外部 javascript 函数(对象)或减少上下文的可能方法
- 在 JavaScript 中为函数对象添加别名
- 在 Express JS 中从路由调用函数对象
- 函数对象的名称属性是什么
- 构造函数对象
- 节点.js - 从另一个函数/对象发出事件
- 声明函数是否会创建具有函数名称和分配给它的函数对象的变量
- 函数对象__proto__和原型属性
- 类仿真 - 模块模式与函数对象