为什么可以't JavaScript构造函数创建字符串或数字

Why can't JavaScript constructors create strings or numbers?

本文关键字:创建 构造函数 字符串 数字 JavaScript 为什么      更新时间:2023-09-26

假设我有一些构造函数:

function Foo() { }
function FooObject() { return {} }
function FooArray() { return [] }
function FooFunction() { return function () {} }
function FooString() { return '' }
function FooNumber() { return 1337 }

我用它们来创建一些对象:

new Foo() // creates Foo instance
new FooObject() // creates object
new FooArray() // creates array
new FooFunction() // creates function

这些都是有道理的,但字符串和数字最终只是实例,为什么?

new FooString() // creates FooString instance: WAT
new FooNumber() // creates FooNumber instance: WAT

为什么会这样?

以下是您感兴趣的行为描述:http://bclary.com/2004/11/07/#a-13.2.2

当调用Function对象F的[[Construct]]属性时采取以下步骤:

  1. 创建一个新的本机ECMAScript对象
  2. 将Result(1)的[[Class]]属性设置为"Object"
  3. 得到F的原型性质的值
  4. 如果Result(3)是一个对象,请将Result(1)的[[Prototype]]属性设置为Result(2)
  5. 如果Result(3)不是对象,请将Result(1)的[[Prototype]]属性设置为原始object原型对象,如中所述15.2.3.1
  6. 调用F的[[Call]]属性,提供Result(1)作为此值,并提供传递到[[Construct]]的参数列表作为参数值
  7. 如果Type(Result(6))为Object,则返回Result(5)
  8. 返回结果(1)

JavaScript中的字符串和数字是不可变的基元类型。而且,因为new运算符实例化了一个新对象,该对象是给定构造函数的实例,所以您得到的是一个对象,而不是基元值。如果您在不使用new运算符的情况下调用这些函数,您将获得所需的基元值。

请参阅MDN关于new运算符的文章。