function ClassA(sColor) {
    this.color = sColor;
}ClassA.prototype.sayColor = function () {
    alert(this.color);
};function ClassB(sColor, sName) {
    ClassA.call(this, sColor);
    this.name = sName;
}ClassB.prototype = new ClassA();ClassB.prototype.sayName = function () {
    alert(this.name);
};上面这段代码中 这句
ClassB.prototype = new ClassA();
为什么不会覆盖ClassB的name属性?

解决方案 »

  1.   

    ClassB.prototype.sayName = function () { 
        alert(this.name); 
    };ClassB.prototype = new ClassA(); 
    这样颠倒下顺序!
      

  2.   

    确实这样sayname和name都被覆盖了?能否告诉我这是为什么?
      

  3.   

    ClassB.prototype = new ClassA(); 
    这句是通过原型链实现了继承,即ClassB拥有了ClassA的属性和方法,同时ClassB拥有的与ClassA同名的属性和方法就重写了父类ClassA的属性和方法,所以ClassB的name是它自己的属性,当然不会被覆盖了!!ClassB得到了ClassA的color属性和sayColor方法,但是ClassA是什么也得不到的,这里说的得到就是继承的意思!!
      

  4.   

    3楼试试如下代码:function ClassA(sColor) { 
        this.color = sColor; 
    } ClassA.prototype.sayColor = function () { 
        alert(this.color); 
    }; function ClassB(sColor, sName) { 
        ClassA.call(this, sColor); 
        this.name = sName; 
    } ClassB.prototype = new ClassA(); ClassB.prototype.sayName = function () { 
        alert(this.name); 
    }; 
    var a=new ClassA("red");
    a.sayColor();//red
    var b=new ClassB("green","feng");b.sayColor();//green
    b.sayName()//feng
    ------以下把sayname和name都被覆盖了
    function ClassA(sColor) { 
        this.color = sColor; 
    } ClassA.prototype.sayColor = function () { 
        alert(this.color); 
    }; function ClassB(sColor, sName) { 
        ClassA.call(this, sColor); 
        this.name = sName; 
    } ClassB.prototype = new ClassA(); ClassB.prototype.sayName = function () { 
        alert(this.name); 
    }; 
    ClassB.prototype = new ClassA(); 
    var a=new ClassA("red");
    a.sayColor();//red
    var b=new ClassB("green","feng");b.sayColor();//green
    b.sayName()//什么也没有
      

  5.   

    ------以下把sayname和name都被覆盖了 
    function ClassA(sColor) { 
        this.color = sColor; 
    } ClassA.prototype.sayColor = function () { 
        alert(this.color); 
    }; function ClassB(sColor, sName) { 
        ClassA.call(this, sColor); 
        this.name = sName; 
    } ClassB.prototype = new ClassA(); ClassB.prototype.sayName = function () { 
        alert(this.name); 
    }; 
    //ClassB.prototype = new ClassA(); 把上楼把这句去掉
    var a=new ClassA("red"); 
    a.sayColor();//red 
    var b=new ClassB("green","feng"); b.sayColor();//green 
    b.sayName()//什么也没有
      

  6.   

    感谢moliu的热心帮助,让我自己来明确一下我的疑惑并解答一下吧我的疑惑其实是ClassA函数中的这句
    this.name = name;与ClassA.prototype被重新复制 到底哪个是后执行的var a = new ClassA()的时候
    实际上执行顺序是这样的
    a=ClassA.prototype;
    ClassA.call(a);所以疑惑解答了如果没有new关键字 ClassA的prototype中的元素不会extract到a中
      

  7.   

    如果这样呢?
    function ClassA(sColor) { 
        this.color = sColor; 
    } ClassA.prototype.sayColor = function () { 
        alert(this.color); 
    }; function ClassB(sColor, sName) { 
        ClassA.call(this, sColor); 
        this.name = sName; 
    } ClassB.prototype.sayName = function () { 
        alert(this.name); 
    }; var a=new ClassA("red"); 
    a.sayColor();//red 
    var b=new ClassB("green","feng"); 
    ClassB.prototype = new ClassA(); 
    b.sayColor();//green ?
    b.sayName()//feng ?
      

  8.   

    ------以下把sayname和name都被覆盖了 function ClassA(sColor) { 
        this.color = sColor; 
    } ClassA.prototype.sayColor = function () { 
        alert(this.color); 
    }; function ClassB(sColor, sName) { 
        ClassA.call(this, sColor); 
        this.name = sName; 
    } ClassB.prototype.sayName = function () { 
        alert(this.name); //函数都有一个原型对象,默认为空,有属性constructor;这里是增加这个
    }; //对象的 sayName属性
    ClassB.prototype = new ClassA(); //把函数的原型对象修改为其它对象,上步的设置属性失效
    var a=new ClassA("red"); 
    a.sayColor();//red 
    var b=new ClassB("green","feng"); 
    b.sayColor();//green 来自新的原型对象的的属性b.sayName()//什么也没有