2011-07-19 73 views
0

一個函數可以返回null,但是有什麼辦法可以讓函數的new實例返回null?在javascript中,NEW函數是否可以返回NULL?

例如,在這種無聊的代碼(嚴格用於說明目的)

 
var f = function(j) { if(j > 5) return null; this.j = j; }; 
for(var f1=f(1); f1; f1=f(fi.j)) { 
    ... 
} 

什麼代碼沒有做的是有new f()返回NULL - 它似乎時只是簡單地扔掉new返回值。這裏new f()除了__proto__之外根本沒有膽量,但拒絕廢止本身。

是尋找無返回物的「對象」的合理選擇嗎?如果是這樣,事先不知道「對象」應該是什麼樣子,那麼測試這個的最好方法是什麼?


解決方案:

考慮到JavaScript的new不能失敗 - 它必須返回一個對象,不能返回空值(參見下面的答案!),恕我直言,正確的方式來完成的例子:

 
var F = function(i) { if(i > 5) throw('tooMuch'); this.i = i; } 
try { 
    for(var f = new F(1); true; f = new F(f.i)) { 
     ... 
    } 
} catch(er) { null; } 

這使用throw/catch循環控制 - 不是我的一杯茶,但在iterators新的JavaScript規格使用這種相同的機制,所以我可能需要思考自己「thow異常」,而不是「t如何錯誤「。

+0

你是什麼意思的膽量?另外,如果您在創建對象時可以返回null,那麼它就沒有任何意義,因爲您沒有看到它自身在任何地方返回。 –

+0

@ilia:膽量,即屬性 - 例如this.jy.不明白你的第二個評論。 –

回答

3

CAN回報您自己的對象,而不是由new給出的對象 - 但要記住它必須是一個對象 - null不會做 - 雖然具有諷刺意味的typeof nullobject

function F(x) { 
    if (x < 10) return new Number(0); 

    this.x = x; 
} 

現在你可以做你的事......

for (var i = 1, k = new F(i); k; k = new F(++i)) { 
    // dance .~.~.~. 
} 
+1

相當不錯!類型的null是一個對象 - 哇!謝謝。 –

1

new F返回一個對象。

null是一個值不是一個對象。

你不能做到這一點

+0

這就是我的想法,儘管最近你是壞消息的傳播者;) –

+0

@cc_young你爲什麼期望'new f'返回'null'?什麼是用例?您可以讓工廠返回'null'。 (像'document.getElementById') – Raynos

+0

實際上,從語法分析來看,並沒有指望'new f()'返回null,但對我來說似乎是反直覺的,所以想要覆蓋基礎。使用「工廠」或者包裝函數,就像@greengit的例子所做的那樣,這個技巧會消除,正如你懷疑的那樣,除去用例,但不像完全返回null的能力那樣優雅 - 但這只是我個人的觀點等等 –

相關問題