《JavaScript高级程序设计》中讲到用对象冒充可以做继承,里面给出的例子如下:function ClassA(sColor) {
    this.color=sColor;
    this.sayColor=function() {
        alert(this.color);
    };
}function ClassB(sColor) {
    this.newMethod=ClassA;
    this.newMethod(sColor);
    delete this.newMethod;
}
这样定义以后,ClassB就继承了ClassA了。书中还提到一句话,“所有的新属性和新方法都必须在删除了新方法的代码行后定义。否则,可能会覆盖超类的相关属性和方法。”也就说,是下面的代码是必须的:delete this.newMethod;
可是我尝试的结果是,就算不要这一句,也覆盖不了超类的属性或方法,所以来请教各位,如果不删除引用,在什么样的情况下可能覆盖父类的属性或者方法?

解决方案 »

  1.   

    ClassB根本就没继承ClassA只是调用了ClassA
    delete this.newMethod;只是为了不让实例使用,只在实例化时调用ClassA
      

  2.   

    删不删都无所谓的, 只是不删除的话ClassB里面就多了个类似于临时属性一样的newMethod属性.
    这个属性是把ClassA引进来而已新代码是能覆盖原类的属性和方法的, 用
    function ClassB(sColor) {
        this.newMethod = ClassA;
        this.newMethod(sColor);
        this.color = sColor + sColor;
        //delete this.newMethod;//删不删都无所谓
    }new ClassB('red!').sayColor();
    试试看.
      

  3.   


    这样是试不出来的吧?这样相当于是在ClassB中重写了ClassA中的color属性,但并没有覆盖掉ClassA中的color值啊。
    用new ClassA('red!').sayColor();就能知道了。
      

  4.   


    那就是说,没有办法用newMethod来覆盖ClassA中的属性和方法了?那书中的这段话岂不是错误的?
      

  5.   

    当然不会覆盖掉ClassA中的color值了, 因为我建立的实例是ClassB的而不是ClassA的
    是没有显式地继承, 但事实是..ClassB已经具有了ClassA的属性color和方法sayColor.
    你可以覆盖掉这些属性和方法, 并且建立新类的实例来使用你自己重写或者添加的属性和方法
      

  6.   


    可是重写父类的属性或方法不正是继承的特点么?如果不能覆盖反而不对了。
    而且这个重写属性和方法关是不是delete了引用什么关系呢?delete了以后还是可以重写啊。
      

  7.   

    LZ你这里根本没用到prototype(原型),算不上真正的继承
    只是调用了ClassA帮ClassB的实例赋值而已LZ要学习js的继承,请把prototype学习一下
      

  8.   


    我知道用prototype实现的继承,但这种使用对象冒充的方法也是实现继承的一种手段。现在通常使用的继承是混合了对象冒充和prototype方式实现的,所以不能说不使用prototype就不算真正的继承吧?prototype只适用于继承父类的方法,比如下面的代码:function ClassA(sColor) {
        this.color=sColor;
    }ClassA.prototype.sayColor=function() {
        alert(this.color);
    };function ClassB(sColor) {
        this.newMethod=ClassA;
        this.newMethod(sColor);
        delete this.newMethod;
    }ClassB.prototype=new ClassA();你说的真正的继承需要使用到prototype是指这样使用么?
    但是这样的使用方式还是存在那个问题,为什么一定要delete这一句?如果不删除,会造成什么影响?
      

  9.   

    不delete没什么 只是会留下一个newMethod方法(ClassA)而已
    LZ既然知道prototype,那知不知道在用prototype方法继承的父类中修改,子类也会改变
    而你这种调用的方法是不可能的
      

  10.   


    是的,这样的纯对象冒充是不能做到这点,所以我也并不认为这种方式是实现继承的最好方式。只是我比较困惑书上那样写诗什么意思。
    现在我尝试的结果是,如果是利用的混合方式进行继承,并且不删除newMethod,那么就可以在后面的代码里面通过newMethod为ClassA增加属性或者方法,也就是可以修改ClassA的结构。但如果是纯粹的对象冒充则看不出有什么问题。
      

  11.   

    如果prototype只适用于继承父类的方法, 那么他实现的所谓"继承"算是什么继承呢?如果不重写/添加/删除任何来自父类的属性和方法, 那么你只不过是复制了一个父类, 给了他另一个名字而已像ClassB和ClassA的这种继承方法, 即使不删除newMethod, ClassB里面也不具有任何新的东西包括newMethod,
    因为你只不过是可以通过ClassB的newMethod属性访问ClassA而已. 这就是说,对于建立好新类ClassB,
    newMethod属性已经没有任何意义, 无非是在ClassB的属性列表里多出了个newMethod而已
      

  12.   


    这个,我没太懂是什么意思。现在没在讨论重写/添加/删除父类的属性和方法,我只是想问为什么一定要删除newMethod?如果不删,是不是仅仅在ClassB中多出了一个没必要的方法而已?但其实并不会对ClassA造成太严重的影响?因为书里面提到的影响好像是很严重的啊。是不是书中写的太夸张了?
      

  13.   

    没有一定要删除newMethod..无所谓的尽信书不如无书