2010-04-13 45 views
2

在以下JavaScript代碼中調用main()。 我的問題是爲什麼第二個構造函數被調用而不是第一個? 我在這裏錯過了什麼?非常基本的JavaScript構造函數問題

謝謝!

function AllInputs() { 
    alert("cons 1"); 
    this.radioInputs = []; 
    alert(this); 
} 

function AllInputs(radioElement) { 
    alert("cons 2"); 
    this.radioInputs = [radioElement]; 
    alert(this); 
} 

AllInputs.prototype.toString = function() { 
    return "[object AllInputs: radioInputs: " + this.radioInputs.length + "]"; 
} 

function main() { 
    var result = new AllInputs(); 
} 

回答

7

Javascript不支持重載函數。

當您定義兩次相同的函數時,第二個定義會替換第一個定義。

相反,您應該製作一個函數,並檢查arguments.length以查看傳遞了多少個參數。

例如:

function AllInputs(radioElement) { 
    this.radioInputs = arguments.length ? [radioElement] : []; 
    alert(this); 
} 
+0

感謝您的解釋! – 2010-04-13 03:12:28

0
function foo() { ... } 

實際上只是

var foo = function() { ... } 

速記因此,你在聲明函數的第二次,你覆蓋變量AllInputs用不同的功能。在Javascript中並不存在兩個具有相同名稱的函數,因爲所有函數都是真正的變量。

+1

其實它們並不完全一樣。 – SLaks 2010-04-13 02:57:05

+0

@SLaks那麼也許「他們處理像變量」? – deceze 2010-04-13 03:03:44

1

在JavaScript中,標識符的最後一個定義用於:

function foo() { return "bar"; } 
var foo = "foo"; 

alert(foo); 

在這種情況下,foo是具有值「foo」的一個變量。如果foo是一個函數,那麼它只會說foo是一個函數。如果您不相信,請嘗試使用alert(foo())而不是僅僅使用alert(foo)。你很可能會在你的控制檯日誌中看到一個錯誤,沒有像alert(foo)(變量...不是函數調用)那樣的可見輸出。