return如何影响创建不带括号的对象的过程?

How does return affect the process of creating an object without parentheses

本文关键字:对象 过程 创建 何影响 影响 return      更新时间:2023-09-26
function B(){}
function A(){
    return B;
}
function C(){
    return "text";
}
new A;         //function B(){}
new C;         //C {}

注意,在new Anew C之后没有()。通常我们会做像new A()这样的事情,我认为这会导致错误,但它运行得很好。现在我从来没有这样使用过new,这对我来说似乎很奇怪。由于某些原因,它们工作,但new A返回函数B,而new C返回新创建的对象,构造函数为C

我也不知道为什么AC是"自动"执行的,一个解释将是伟大的。谢谢。

new Anew A()只是语法上的一个怪癖,它们是完全相等的。如果你去掉括号,就好像你把它们包括进去了一样。创建新对象,给定原型A.prototype,然后用新对象this调用A。只有当你有参数要传递给构造函数时,才需要括号。

return如何影响创建不带括号的对象的过程

构造函数的返回值不受是否在new表达式中使用()的影响。同样,new Anew A()是完全等价的。

构造函数的返回值是这样的(不管是否使用()): new操作符创建一个对象,new表达式的结果是对该对象的引用,除非构造函数返回一个非null对象引用。如果它返回任何原语(如"text")或null,它的返回值是,被new运算符完全忽略new表达式的结果是new创建的对象。只有当构造函数返回一个非null对象引用时,new才会返回它所创建的对象以外的任何东西;在这种情况下,new表达式的结果是构造函数返回的对象引用。此异常可以返回满足new语义的现有对象,而不是新对象。

所有血腥的细节都在规范中,§11.2.2和§13.2.2(以冗长的文字)。