2011-08-15 57 views
13

对象时,如果我有这样的功能需要RETURN:是从构造函数创建新

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

当这样创建对象:

var my_obj = new Apple(); 

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

+0

可能重复[可以构造函数返回以避免返回此值?](http://stackoverflow.com/questions/1978049/what-values-can-a-constructor-return-to-avoid-返回,这一点) –

回答

16

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

见点11.2.2和13.2.2 ECMAScript 5

新操作员调用内部[[构建]]方法在构造(通常是功能):

11.2.2新的运营商

生产NewExpression:如下新NewExpression评价:

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

的〔〔构建体]的函数内部方法在点13.2.2描述:

13.2.2 [[构建体]]

当[[构建]]函数对象的内部方法用一个可能为空的参数列表调用F,采取以下步骤:采取以下步骤:

  1. 让obj b e新创建的本地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]]内部属性设置为如15.2.4所述的标准内置对象原型 对象。
  8. 让结果成为调用F的[[Call]]内部属性的结果,提供obj作为此值并将传递给[[Construct]]的参数列表作为参数提供。
  9. 如果Type(result)是Object,则返回结果。
  10. 返回目标。
2

这是没有必要的。

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

无效返回(例如原语或非新对象)仍将返回标准this

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

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

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

jsFiddle

4

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

关于明确地返回从构造函数的值这个页面已经好信息:JavaScript: Constructor Return Value

报价:

如果一个构造函数没有返回值,空,或任何原子/非对象值,则表示值被忽略并且新创建的对象引用被返回给调用者。例如,来自构造函数的返回值0(零)将被忽略。

...第二片神奇躲避上面是返回一个特定的,可能存在的预对象,而不是一个新的实例的引用的能力的构造函数。如果需要,这将允许您自己管理实际实例的数量;可能是由于资源有限或者不适合的原因。