构造函数返回对象 - 文档说明?

时间:2014-03-20 15:31:28

标签: javascript

我试图在文档中找到/了解以下代码的此行为:

我看到了这段代码here

 function f(){ return f; }
 new f() instanceof f;          //false

这是因为(来自我read}:

  

constructor返回对象时,new运算符将会产生   返回的对象

因为ffunction - new运算符会产生返回的对象,在这种情况下为f

所以:new f() === f

因此:f instanceof f // false。

问题:

我在文档中搜索此行为描述,但无法找到它。

我只在mdn中找到了部分答案:

enter image description here

然而 - 看着docs(这就是我真正追求的):

所有这一切都是:

enter image description here

没有提及constructor返回object or not的情况(我确定我错过了它)

问题: 文档在哪里解释了行为?

nb,

我知道构造函数不应该(通常)返回任何东西,这个问题是为了知识。

nb2:

此行为的示例:

var z = {a: 2}; 
function g() { return z; } 
var x = new g(); 
x === z;  //true

在这里,x实际上等于z,直到身份!

3 个答案:

答案 0 :(得分:7)

那是因为此行为是internal [[Construct]] method的属性,而不是new

  

1。让obj成为新创建的本机ECMAScript对象   [...]
  8.让result成为调用[[Call]]的{​​{1}}内部属性的结果,提供F作为此值并提供传递到obj的参数列表作为[[Construct]]
  9.如果argsType(result),则返回 Object   10. 返回 result

obj是通过F调用的函数(在您的情况下为new)。由于f返回一个对象(步骤8),因此返回它(步骤9)。如果它不是对象,则返回步骤1中的对象(步骤10)。

f只返回new返回的内容:

  

5。返回调用[[Construct]]内部方法[...]

的结果

答案 1 :(得分:3)

找到了您正在寻找的内容here。您在上面引用的 NewExpression 的文档指定了它

  

返回调用[[Construct]]内部方法

的结果

[[Construct]]方法的规范是您所需要的。

答案 2 :(得分:2)

Page 100 here

... 8让结果成为调用F的[[Call]]内部属性的结果,提供obj作为该值并提供 参数列表作为args传递给[[Construct]]。

9如果Type(result)为Object,则返回结果。

10返回obj。