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明明删除了newMethod,为什么ClassB实例化的对象依然可以引用ClassA的方法呢?

解决方案 »

  1.   

    你的意思是 在ClassB对象被实例化的时候,newMothed还没有被delete?
      

  2.   

    var b = new ClassB();
    首先先纠正一下楼主。。b.sayColor()不是调用ClassA的方法,而是调用ClassB的方法,与A没关系的
    因为在
    this.newMethod=ClassA; 
    this.newMethod(sColor);
    这里ClassB已经把ClassA的所有成员变量都拷贝完了。。记住是拷贝,不是引用看下下面例子就知道了
    var ClassA = function (sColor) { 
    this.color = sColor; 
    this.sayColor = function() { 
       alert(this.color); 
    }; 

    function ClassB(sColor) { 
    this.newMethod=ClassA; 
    this.newMethod(sColor);
    delete this.newMethod; 
    }function ClassB(sColor) { 
    this.newMethod=ClassA;
    this.newMethod(sColor);
    delete this.newMethod;
    }var b = new ClassB("red");ClassA = function(){} //修改ClassA为一个空的函数b.sayColor();//red
      

  3.   


    function ClassB(sColor) { 
        this.newMethod=ClassA;  //this.newMethod的引用指向ClassA
        this.newMethod(sColor); //调用newMethod方法
        delete this.newMethod;  //删除newMethod引用
    }调用newMehtod执行结束后才delete this.newMethod。
    每次实例化的时候都会先执行 this.newMethod=ClassA,给ClassB添加了newMethod方法, 所以this.newMethod可定可以执行啊
      

  4.   

    补充一下,只有原型才是引用。。
    this.xxx这些是存放到实例单独副本中的,无论构造函数怎么改变都不会影响到var Person = function (name){
        this.name = name;
    }var p = new Person("csdn");Person = function(){
        this.name = "111"
    }alert(p.name)