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

为什么构造函数返回对象,而不是JavaScript中的原语?,javascript,constructor,Javascript,Constructor,我试图理解JavaScript(或至少是V8)关于构造函数的行为 我知道,JavaScript构造函数不应该返回任何东西(因此:未定义的) 但是考虑这个JavaScript: function Thing() { return ''; } var t = new Thing(); console.log(t, typeof t); // => Thing {} "object" 现在,如果您这样做: function Thing() { return { hi: '' };

我试图理解JavaScript(或至少是V8)关于构造函数的行为

我知道,JavaScript构造函数不应该返回任何东西(因此:
未定义的

但是考虑这个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中的构造函数会返回一个对象,而不是一个原语呢


中也提到了这种行为,但没有解释。我还浏览了ECMAScript规范的一部分,并对其进行了删节,但这并不是很有启发性


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

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

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

因此,内部方法(通过调用)将检查以下项返回的值的类型:

  • 让result作为调用F的[[Call]]内部属性的结果,提供obj作为值,并提供 参数列表作为参数传递到[[Construct]]
  • 如果(结果)是对象,则返回结果
  • 返回obj
  • 事实上,这是一个:

    [[Construct]]()

    • 返回值的类型必须是Object

    首先,这不是“错误和丑陋”,因为它没有做你认为它是什么。当它不是基元对象时,为什么它会返回基元呢?简而言之:如果从构造函数返回基元,它将被忽略。如果返回一个对象,它将用作结果对象。这回答了问题吗?或者,您正在寻找这种行为的基本原理?它的行为方式是“因为规范这么说”。然而,我认为你正在寻找的“为什么”解释可能是基于观点的——你需要得到一个能显示语言设计团队推理的答案,其他任何东西都只是某人的观点——例如,我的观点是:你调用了
    new
    ,所以你期待一个对象,也许语言设计团队认为,即使函数返回原语,您也应该始终获得一个对象,但我无法支持这种推理。继续@James的推理。。。函数可能会返回类似于
    true
    false
    的内容作为副作用,可以安全地忽略这些副作用;但是如果返回一个“严重的”对象,则该对象很可能是对象构造函数的返回值。@malte调用,这样做。就像注释中的链接一样。我没发现。谢谢在我看来,这没有多大意义——但这不是发表意见的地方:)。