我正在尝试使用new
关键字,但我无法找到此行为的解释。
假设我们有一个函数返回一个整数:
(在萤火虫中)
>>> function x() { return 2; }
>>> x()
2
>>> new x()
x { }
但是如果函数返回一个数组:
>>> function y() { return [2]; }
>>> y()
[2]
>>> new y()
[2]
为什么?
答案 0 :(得分:16)
new
运算符有一个有趣的行为:它返回运算符创建的对象,除非构造函数返回不同的对象。忽略构造函数的任何非对象返回值,这就是当您返回2
时没有看到此内容的原因。
当您说new x()
:
x.prototype
。x
并将this
设置为新对象。x
不返回任何内容,new
表达式的结果是在步骤1中创建的新对象。但是,如果{{ 1}}返回非x
对象引用,然后该对象引用是null
表达式的结果,而不是在步骤1中创建的对象。任何其他类型的返回值(new
,原始数字,原始字符串,null
等)被忽略;它必须是非undefined
对象引用,才能优先于创建的对象null
。 new
运算符对对象引用的这种特殊处理允许您将另一个对象替换为创建的new
对象。这在某些有限的情况下可以很方便,但浩大大部分时间,设计用于new
的函数(称为构造函数)什么都没有。
对于某些轻读(hah!),这由规范的Section 13.2.2(“[[Construct]]”)涵盖(HTML; {{3 } {},由PDF引用(“new
运算符”)。
答案 1 :(得分:5)
因为数组是一个对象,但2
不是。
如果使用new
关键字调用函数,则必须返回一个对象。如果您没有明确地这样做,它会自动返回this
(这是一个继承自funcName.prototype)
的空对象。