使用new创建对象时,是否需要从构造函数返回RETURN

时间:2011-08-15 12:05:15

标签: javascript specifications

如果我有这样的功能:

function Apple(){
    this.color = "green";
    return this;
}

创建这样的对象时:

var my_obj = new Apple();

是必需的行return this;和/或是否通过语言参考有效?

3 个答案:

答案 0 :(得分:16)

不,不需要返回this,但它有效。如果返回的值是对象,new将返回该对象而不是新创建的对象。

ECMAScript 5的第11.2.2和13.2.2点:

new运算符在构造函数(通常是函数)上调用内部[[Construct]]方法:

  

11.2.2新算子

     

生产NewExpression:新的NewExpression评估如下:

     
      
  1. 让ref成为评估NewExpression的结果。
  2.   
  3. 让构造函数为GetValue(ref)。
  4.   
  5. 如果Type(构造函数)不是Object,则抛出TypeError异常。
  6.   
  7. 如果构造函数未实现[[Construct]]内部方法,则抛出TypeError异常。
  8.   
  9. 返回在构造函数上调用[[Construct]]内部方法的结果,不提供任何参数(即参数的空列表)。
  10.   

函数的[[Construct]]内部方法在第13.2.2节中描述:

  

13.2.2 [[Construct]]

     

当使用可能为空的参数列表调用Function对象F的[[Construct]]内部方法时,将执行以下步骤:

     
      
  1. 让obj成为新创建的本机ECMAScript对象。
  2.   
  3. 按照8.12中的规定设置obj的所有内部方法。
  4.   
  5. 将obj的[[Class]]内部属性设置为“Object”。
  6.   
  7. 将obj的[[Extensible]]内部属性设置为true。
  8.   
  9. 让proto成为使用参数“prototype”调用F的[[Get]]内部属性的值。
  10.   
  11. 如果Type(proto)是Object,则将obj的[[Prototype]]内部属性设置为proto。
  12.   
  13. 如果Type(proto)不是Object,则将obj的[[Prototype]]内部属性设置为标准的内置Object原型   对象,如15.2.4。
  14. 中所述   
  15. 让结果成为调用F的[[Call]]内部属性的结果,提供obj作为此值,并将传递给[[Construct]]的参数列表作为args。
  16.   
  17. 如果Type(result)为Object,则返回结果。
  18.   
  19. 返回obj。
  20.   

答案 1 :(得分:4)

没有必要,构造函数会自动返回新创建的对象。

关于从构造函数显式返回值,此页面具有良好的信息:JavaScript: Constructor Return Value

引用:

  

如果构造函数返回任何内容,null或任何原子/非对象值,则忽略所述值,并将新创建的对象引用返回给调用者。例如,将忽略构造函数的返回值0(零)。

  

......上面提到的第二个魔法是构造函数返回特定的,可能预先存在的对象的能力,而不是对新实例的引用。这将允许您在需要时自己管理实际实例的数量;可能是因为资源有限或诸如此类的原因。

答案 2 :(得分:2)

没有必要。

当使用Object运算符实例化时,该函数将隐式返回新的newthis将在该上下文中引用该新对象。

无效的返回(例如基元或非新对象)仍将返回标准this

您可以通过返回一个新的不同对象来覆盖它。

var a = function() {
    return new Number(42);
},

b = new a; // typeof b === 'number'.

jsFiddle