可以说我有一些构造函数:
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)
为什么是这样?
以下是您感兴趣的行为的描述:http://bclary.com/2004/11/07/#a-13.2.2
调用Function对象F的[[Construct]]属性时,将执行以下步骤:
- 创建一个新的本机ECMAScript对象.
- 将Result(1)的[[Class]]属性设置为"Object".
- 获取F的原型属性的值.
- 如果Result(3)是对象,则将Result(1)的[[Prototype]]属性设置为Result(3).
- 如果Result(3)不是对象,请将Result(1)的[[Prototype]]属性设置为原始Object原型对象,如15.2.3.1中所述.
- 调用F的[[Call]]属性,提供Result(1)作为该值,并提供传递给[[Construct]]的参数列表作为参数值.
- 如果Type(Result(6))是Object,则返回Result(6).
- 返回结果(1).