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

时间:2013-12-16 19:33:59

标签: javascript

假设我有一些构造函数:

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

为什么会这样?

2 个答案:

答案 0 :(得分:5)

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

  

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

     
      
  1. 创建一个新的本机ECMAScript对象。
  2.   
  3. 将Result(1)的[[Class]]属性设置为“Object”。
  4.   
  5. 获取F。
  6. 的prototype属性的值   
  7. 如果Result(3)是对象,请将Result(1)的[[Prototype]]属性设置为Result(3)。
  8.   
  9. 如果Result(3)不是对象,请将Result(1)的[[Prototype]]属性设置为原始Object原型对象,如   15.2.3.1。
  10.   
  11. 调用F的[[Call]]属性,提供Result(1)作为此值,并提供传递给[[Construct]]的参数列表作为   参数值。
  12.   
  13. 如果Type(Result(6))为Object,则返回Result(6)。
  14.   
  15. 返回结果(1)。
  16.   

答案 1 :(得分:1)

JavaScript中的字符串和数字是primitive types,它们是不可变的。并且,因为new运算符实例化作为给定构造函数的实例的新对象,所以获得对象而不是原始值。如果您在没有new运算符的情况下调用这些函数,则可以获得您期望的原始值。

请参阅the MDN article on the new operator