假设我有一些构造函数:
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
为什么会这样?
答案 0 :(得分:5)
以下是您感兴趣的行为的说明:http://bclary.com/2004/11/07/#a-13.2.2
当调用Function对象F的[[Construct]]属性时, 采取以下步骤:
- 创建一个新的本机ECMAScript对象。
- 将Result(1)的[[Class]]属性设置为“Object”。
- 获取F。
的prototype属性的值- 如果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)。
醇>
答案 1 :(得分:1)
JavaScript中的字符串和数字是primitive types,它们是不可变的。并且,因为new
运算符实例化作为给定构造函数的实例的新对象,所以获得对象而不是原始值。如果您在没有new
运算符的情况下调用这些函数,则可以获得您期望的原始值。