简短的回答
在返回对象时使用运算符和删除它没有太大区别。new
引用“JavaScript 花园”:
如果被调用的函数没有显式的 return 语句,那么它会隐式返回 this 的值——新对象。在显式返回语句的情况下,函数返回该语句指定的值,但前提是返回值是一个对象。
语言规范告诉我们:
如果 Type(result) 是 Object 则返回结果。
返回对象。
在[[construct]]
指定如何完成构造函数的算法中。
语言规范的简短介绍
但是,对于您雄心勃勃的类型 - 让我们一起在语言规范中探讨原因!我们怎么能自己想出来呢?
这就是为什么,我们正在评估new NewExpression
newExpression 是您的函数的原因。我通过检查新关键字在索引中的作用到达那里。
第一的:
- 令 ref 为计算 NewExpression 的结果。
这是函数调用
然后:
- 让构造函数为 GetValue(ref)。
里面GetValue
去:
返回调用 GetBindingValue(参见 10.2.1)具体方法的结果,该方法将 GetReferencedName(V) 和 IsStrictReference(V) 作为参数传递。
这将返回函数本身(基于this)
如果 Type(constructor) 不是 Object,则抛出 TypeError 异常。
函数是 JS 中的对象,所以一切都很好。
如果构造函数没有实现 [[Construct]] 内部方法,则抛出 TypeError 异常。
这会检查它是否是一个函数。所有函数都有构造方法(把函数看成构造函数,你可以试试评估(function(){}).constructor
看看。
返回在构造函数上调用 [[Construct]] 内部方法的结果,不提供任何参数(即一个空的参数列表)。
伟大的!让我们看看有什么[[construct]]
作用。它在13.3.2中定义中定义,它说了很多事情。大奖是这样的:
令 result 为调用 F 的 [[Call]] 内部属性的结果,提供 obj 作为 this 值,并提供传递给 [[Construct]] 的参数列表作为 args。
如果 Type(result) 是 Object 则返回结果。返回对象。
叮叮叮!
所以在内部,规范说如果你的函数返回一个对象,构造函数会返回它而不是创建的对象。
注意(一个很小的区别是,当您不在严格模式下时,使用new
可能会遇到错误)
奖励:这是对 JavaScript garden 中构造函数的一个很好的解释