为什么可以't JavaScript构造函数创建字符串或数字
Why can't JavaScript constructors create strings or numbers?
假设我有一些构造函数:
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]]属性时采取以下步骤:
- 创建一个新的本机ECMAScript对象
- 将Result(1)的[[Class]]属性设置为"Object"
- 得到F的原型性质的值
- 如果Result(3)是一个对象,请将Result(1)的[[Prototype]]属性设置为Result(2)
- 如果Result(3)不是对象,请将Result(1)的[[Prototype]]属性设置为原始object原型对象,如中所述15.2.3.1
- 调用F的[[Call]]属性,提供Result(1)作为此值,并提供传递到[[Construct]]的参数列表作为参数值
- 如果Type(Result(6))为Object,则返回Result(5)
- 返回结果(1)
JavaScript中的字符串和数字是不可变的基元类型。而且,因为new
运算符实例化了一个新对象,该对象是给定构造函数的实例,所以您得到的是一个对象,而不是基元值。如果您在不使用new
运算符的情况下调用这些函数,您将获得所需的基元值。
请参阅MDN关于new
运算符的文章。
相关文章:
- 文本表示法VS.构造函数,用于在JavaScript中创建对象
- 使用sinon.js创建一个“;“间谍对象”;使用基于真实构造函数/原型的间谍方法
- 对使用函数构造函数创建的函数的内部引用
- 获取使用函数构造函数创建的函数的名称
- 创建 JavaScript 构造函数时的语法错误
- 为什么可以't JavaScript构造函数创建字符串或数字
- 如何在构造函数中创建一个简单的DOM元素,并在调用时将其附加到元素中
- 为什么用构造函数创建对象会执行对象's方法
- 我应该在原型上还是在新创建的实例上调用构造函数方法
- 使用构造函数创建对象和返回对象有区别吗
- 是否可以在函数构造函数中识别哪个对象调用它,并在错误的对象调用时中止创建
- 构造函数中的方法和创建构造函数后函数上的方法有什么区别
- 创建构造函数的构造函数 (JavaScript)
- 如何在 angularjs 中为控制器创建构造函数
- Angular 1.4.8/JS:创建构造函数并将属性继承到第三个对象中
- 如何创建构造函数Count
- AngularJS设计模式:我应该使用工厂来创建构造函数吗
- 在Javascript中,函数声明是创建构造函数的唯一方法
- 使用Object.keys获取用于创建构造函数实例的属性,然后打印继承的属性
- 是否只创建构造函数的一个实例