为什么构造函数返回对象,而不是JavaScript中的原语?

Bai*_*Dev 5 javascript constructor

我正在尝试理解关于构造函数的JavaScript(或至少V8)行为.

我知道,JavaScript构造函数应该永远不会返回任何东西(所以:) undefined.

但请考虑这个JavaScript:

function Thing() { 
  return '';
}
var t = new Thing();
console.log(t, typeof t); // => Thing {} "object"
Run Code Online (Sandbox Code Playgroud)

现在,如果你这样做:

function Thing() { 
  return { hi: '' };
}
var t = new Thing();
console.log(t, typeof t); // => Object {hi: ""} "object"
Run Code Online (Sandbox Code Playgroud)

乃至:

function Thing() { 
  this.a = 'a';
  return { hi: '' };
}
var t = new Thing();
console.log(t, typeof t); // => Object {hi: ""} "object"
Run Code Online (Sandbox Code Playgroud)

那么,如果你编写这种代码,为什么JavaScript中的构造函数会返回一个对象,而不是一个原语?


这个SO答案中也提到了这种行为,但没有解释.我还滚动了ECMAScript规范的新操作员部分,其Construct剪断,但这并不具有启发性.

任何提示或知识(请用简单的英文)?

Ori*_*iol 4

这是因为,根据定义,构造函数的目的是生成对象,而不是基元:

4.3.4 构造函数

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

因此,[[Construct]]内部方法(通过new操作符调用)检查[[Call]]返回值的类型:

13.2.2 [[构造]]

  1. result为调用F的 [[Call]] 内部属性、提供obj作为this值并提供传递到 [[Construct]] 的参数列表作为args的结果。
  2. 如果Type ( result ) 是 Object,则返回result
  3. 返回obj

事实上,这是一个不变量

[[构造]] ( )

  • 返回值的类型必须是Object。