返回如何影响创建没有括号的对象的过程

时间:2014-08-22 21:51:53

标签: javascript class syntax

function B(){}

function A(){
    return B;
}

function C(){
    return "text";
}

new A;         //function B(){}
new C;         //C {}

请注意()new A之后没有new C。通常我们会做类似new A()的事情,我认为这会导致错误,但它运行正常。现在我以前从未使用new,这对我来说似乎很奇怪。出于某种原因,他们工作但new A返回函数B,同时new C返回新创建的对象,构造函数为C

另外,我不知道为什么AC是"自动"执行,解释会很棒。感谢。

1 个答案:

答案 0 :(得分:2)

new Anew A()的关系只是语法的一个怪癖,它们完全相同。如果你不用括号,它就像你把它们包括在内一样。在给定原型A.prototype的情况下创建新对象,然后使用新对象A调用this。只有在您有参数传递给构造函数时才需要括号。

  

返回如何影响创建没有括号的对象的过程

()表达式中使用new,构造函数的返回值不会受到任何影响。同样,new Anew A()完全相同。

这里是关于构造函数返回值的处理(无论是否使用()):new运算符创建一个对象,结果为{{1 expression是对该对象的引用,除非构造函数返回非new对象引用。如果它返回任何原语(例如null)或"text",则null运算符的返回值完全被忽略并且{{{ 1}} expression是创建的对象new。唯一的时间new返回除了它创建的对象之外的任何内容,如果构造函数返回非new对象引用;在这种情况下,new表达式的结果是构造函数返回的对象引用。此异常使得返回现有对象以满足null语义而不是新对象成为可能。

所有血腥的细节都在规范§11.2.2§13.2.2中(粗俗的散文)。