事实上,在两段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>"); 这段代码能顺利执行。

解决方案 »

  1.   

    非常感谢,还想请教一下,在java中定义了一个A类,他包括a,b,c三个属性,我可以创建A(x,y){a=x;b=y}和A(x){c=x;}两个构造函数来创建包含不同属性的两个对象,例如:var ex1=new A(x,y);和var ex2=A(x); ex1中包含a,b属性但是不包含c属性,ex2只包含c属性。在js中可以实现这种效果吗?
      

  2.   

    硬想这样也可以
    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);
      

  3.   

    js没有其他语言意义上的函数重载。
    但是每个函数都有个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];
        }
    }
    只是举个例子,具体的处理就要看你自己了