事实上,在两段js代码中,当新建一个Rec对象时,都会执行第二个构造函数,而第一个构造函数是被第二个覆盖掉了,相当于第一个构造函数是不存在的。也就是说,这两端代码把第一个构造函数去掉,会和保留它的作用一样,这样理解起来应该就要容易一些。在第一段代码中:
var rec1=new Rec(1,2);
document.write(rec1.a+" <br>");
document.write(rec1.b+" <br>");
document.write(rec1.area()+" <br>");
这段代码执行第二个构造函数,显然是没有问题的,会认为参数c没有传递进去,因此此时rec1是有a=1,b=2,c=undefined,这几个属性。area这个函数是不存在的,因此document.write(rec1.area()+" <br>"); 这段代码会出错。在第二段代码中:
var rec1=new Rec(1,2);
rec1.area=rec_area;
document.write(rec1.a+" <br>");
document.write(rec1.b+" <br>");
document.write(rec1.area()+" <br>");
也是执行的第二个构造函数,c的值同样为undefined,但这里用rec1.area=rec_area;这段代码给rec1增加了area方法,因此document.write(rec1.area()+" <br>"); 这段代码能顺利执行。
var rec1=new Rec(1,2);
document.write(rec1.a+" <br>");
document.write(rec1.b+" <br>");
document.write(rec1.area()+" <br>");
这段代码执行第二个构造函数,显然是没有问题的,会认为参数c没有传递进去,因此此时rec1是有a=1,b=2,c=undefined,这几个属性。area这个函数是不存在的,因此document.write(rec1.area()+" <br>"); 这段代码会出错。在第二段代码中:
var rec1=new Rec(1,2);
rec1.area=rec_area;
document.write(rec1.a+" <br>");
document.write(rec1.b+" <br>");
document.write(rec1.area()+" <br>");
也是执行的第二个构造函数,c的值同样为undefined,但这里用rec1.area=rec_area;这段代码给rec1增加了area方法,因此document.write(rec1.area()+" <br>"); 这段代码能顺利执行。
function A(){
if (arguments[0]!=null) this.a=arguments[0];
if (arguments[1]!=null) this.a=arguments[1];
if (arguments[2]!=null) this.a=arguments[2];
}var ex1=new A(10,20,null);
var ex2=new A(null,null,10);
但是每个函数都有个arguments,你可以在函数内部使用它来得到传递给函数的参数。因此你就可以通过判断arguments的长度(leng
th)来模仿函数重载的效果
function test(x,y,z)//其实这里有没有参数列表都一样,js不会理会这些
{
if(arguments.length == 2 )
{
this.a = arguments[0];
this.b = arguments[1];
}
else if(arguments.length == 3 )
{
this.c = arguments[2];
}
}
只是举个例子,具体的处理就要看你自己了