2010-04-13 66 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)(变量...不是函数调用)那样的可见输出。