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

时间:2016-02-29 15:09:24

标签: javascript constructor

我正在尝试理解有关构造函数的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剪断了,但这并不具有启发性。

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

1 个答案:

答案 0 :(得分:4)

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

  

4.3.4 constructor

     

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

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

  

13.2.2 [[Construct]]

     
      
  1. 结果成为调用 F 的[[Call]]内部属性的结果,提供 obj 作为这个价值和提供   参数列表作为 args 传递给[[Construct]]。
  2.   
  3. 如果Type结果)是对象,则返回结果
  4.   
  5. 返回 obj
  6.   

事实上,这是一个invariant

  

[[Construct]]()

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