为啥构造函数只能返回一个对象?

Posted

技术标签:

【中文标题】为啥构造函数只能返回一个对象?【英文标题】:Why can a constructor only return an object?为什么构造函数只能返回一个对象? 【发布时间】:2011-10-10 04:03:06 【问题描述】:

如果有这样的构造函数

function a() 

然后

(new a) instanceof a === true

但另一方面,

function a()  return  

结果

(new a) instanceof a === false

原来我是这么想的

function a()  return 123 

会产生同样的结果。但是,当返回一个数字时,

(new a) instanceof a === true

这怎么可能?为什么我不能让构造函数返回 Object 以外的东西?

(我知道让构造函数返回一个数字是相当无用的,但我想了解这种行为的“原因”)

【问题讨论】:

构造函数并不意味着返回一个对象 吹毛求疵:您当然可以返回Number,但不能返回numberfunction a() return new Number(123); 。结果甚至可以用作数字 (a() + 1 === 124),它只是不会将 === 与具有其值的真实数字进行比较。 @Kevin Reid:我明白了。我猜那是因为Number 是一个对象,而number 是一个原语。 (对吗?) pimvdb:是的。通常最好避免使用 value-wrapper 对象,因为它们的语义略有不同会引起混淆。您找到它们的主要位置是对数字调用的方法具有this instanceof Number What is returned from a constructor?的可能重复 【参考方案1】:

根据规范:如果调用构造函数返回一个对象,那么这个对象就是new-表达式的结果。如果构造函数没有返回对象(但undefined 或其他一些原始值),则结果是新创建的对象。

如果允许使用原语,那么所有构造函数都必须显式返回某些内容(通常是“this”),否则结果将是 undefined(因为没有 return 的函数的结果是 undefined )。这将是一个不必要的麻烦。

此外,可以依赖 new 始终返回一个对象是有道理的。

【讨论】:

以上是关于为啥构造函数只能返回一个对象?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在按值返回时总是调用复制构造函数

为啥我的 Dart 构造函数返回的是动态对象而不是类型对象?

javascriptnew的时候为啥会执行构造函数?

java构造函数

为啥我只能在类型参数位置传递部分应用的类型构造函数?

为啥我在构造函数中填充的这个数组在构造函数返回后没有填充?