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

Mar*_*era 14 javascript specifications

如果我有这样的功能:

function Apple(){
    this.color = "green";
    return this;
}
Run Code Online (Sandbox Code Playgroud)

在创建这样的对象时:

var my_obj = new Apple();
Run Code Online (Sandbox Code Playgroud)

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

Arn*_*anc 17

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

ECMAScript 5的第 11.2.2和13.2.2点:

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

11.2.2新运营商

生产NewExpression:new NewExpression的计算方法如下:

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

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

13.2.2 [[构造]]

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

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