2014-03-05 93 views
1

假設我們有兩個功能,如以下內容:函數(構造函數)返回類型的Javascript奇怪的行爲

function a(){ this.x = 5; return {z:20};} 
function b(){ this.x = 5; return 30;} 
現在

如果您運行這些行一切似乎是合理的:

a(); //output : {z:20} 
b(); //output : 30; 

但如果你運行它們作爲對象構造函數:

new a() //output : Object {z:20} 
new b() //output : b {x:5} 

我不明白如果new構造函數應該總是返回一個對象,爲什麼行爲不同? JavaScript觀看返回類型嗎?如果返回類型是一個對象,則直接返回,如果不是,則返回啓動的實例?

我想,如果它是一個構造函數,所以要經常忽略的返回類型和returs發起對象。我認爲這種行爲使得JavaScript太複雜。在這裏還有別的東西,我不明白嗎?

回答

2

我不明白如果新的構造函數應該總是返回一個對象,爲什麼行爲不同? JavaScript觀看返回類型嗎?如果返回類型是一個對象,則直接返回,如果不是,則返回啓動的實例?

基本上是肯定的。如果函數的返回值不是一個對象,該new運算符返回this(新目標),而不是(實際上它的內部[[Construct]] method這確實是)。

我認爲如果它是一個構造函數,所以它應該總是忽略返回類型,並且會反向啓動的對象。我認爲這種行爲使得JavaScript太複雜。在這裏還有別的東西,我不明白嗎?

這真的更多的是主觀意見。優點是構造函數可以決定返回一個不同的值,這使得它更加靈活。另一方面,我認爲不返回價值比其他方式更常見。

+0

謝謝您澄清,但我認爲這使得JS更復雜的理解和調試和IntelliSense支持和...。我不知道這種靈活性可以帶來多大的好處 –