我正在尝试理解有关构造函数的JavaScript(或至少是V8)行为。
我知道,JavaScript构造函数不应该返回任何内容(所以:undefined
)。
但请考虑这个JavaScript:
function Thing() {
return '';
}
var t = new Thing();
console.log(t, typeof t); // => Thing {} "object"
现在,如果你这样做:
function Thing() {
return { hi: '' };
}
var t = new Thing();
console.log(t, typeof t); // => Object {hi: ""} "object"
甚至:
function Thing() {
this.a = 'a';
return { hi: '' };
}
var t = new Thing();
console.log(t, typeof t); // => Object {hi: ""} "object"
那么,如果你编写这种代码,为什么JavaScript中的构造函数会返回一个对象,而不是一个原语呢?
this SO answer中也提到了这种行为,但没有解释。我还滚动了ECMAScript规范的The new Operator部分,其Construct剪断了,但这并不具有启发性。
任何提示或知识(请用简单的英文)?
答案 0 :(得分:4)
这是因为,根据定义,构造函数的目的是生成对象,而不是基元:
创建和初始化对象的函数对象
因此,[[Construct]]内部方法(通过new
operator调用)会检查[[Call]]返回的值的类型:
- 让结果成为调用 F 的[[Call]]内部属性的结果,提供 obj 作为这个价值和提供 参数列表作为 args 传递给[[Construct]]。
- 如果Type(结果)是对象,则返回结果。
- 返回 obj 。
醇>
事实上,这是一个invariant:
[[Construct]]()
- 返回值的类型必须为Object。