【问题标题】: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

标签: javascript object constructor return instanceof


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-06
    相关资源
    最近更新 更多