为什么JavaScript构造函数不能创建字符串或数字?

alt*_*alt 2 javascript

可以说我有一些构造函数:

function Foo() { }
function FooObject() { return {} }
function FooArray() { return [] }
function FooFunction() { return function () {} }
function FooString() { return '' }
function FooNumber() { return 1337 }
Run Code Online (Sandbox Code Playgroud)

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

new Foo() // creates Foo instance
new FooObject() // creates object
new FooArray() // creates array
new FooFunction() // creates function
Run Code Online (Sandbox Code Playgroud)

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

new FooString() // creates FooString instance: WAT
new FooNumber() // creates FooNumber instance: WAT
Run Code Online (Sandbox Code Playgroud)

为什么是这样?

Vit*_*huk 5

以下是您感兴趣的行为的描述: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(3).
  5. 如果Result(3)不是对象,请将Result(1)的[[Prototype]]属性设置为原始Object原型对象,如15.2.3.1中所述.
  6. 调用F的[[Call]]属性,提供Result(1)作为该值,并提供传递给[[Construct]]的参数列表作为参数值.
  7. 如果Type(Result(6))是Object,则返回Result(6).
  8. 返回结果(1).

  • 这里最重要的是第7步.可能值得强调;) (2认同)