2011-08-15 164 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(零)將被忽略。

...第二片神奇躲避上面是返回一個特定的,可能存在的預對象,而不是一個新的實例的引用的能力的構造函數。如果需要,這將允許您自己管理實際實例的數量;可能是由於資源有限或者不適合的原因。