function ClassA(sColor )
{
this.color = sColor;
this.sayColor = function()
{
alert(this.color);
}
}function ClassB(sColor, sName)
{
this.newMethod = ClassA;  
this.newMethod(sColor); 
delete this.newMethod;    //这句会在什么时间执行?
this.sayName = function()
{
alert(this.sName);
}
}var objA = new ClassA('red');    
var objB = new ClassB('blue','Nicholas');
objA.sayColor();
objB.sayColor(); //此程序的执行流程是什么 ? 

解决方案 »

  1.   

    function ClassA(sColor )
    {
        this.color = sColor;
        this.sayColor = function()
        {
            alert(this.color);
        }
    }//让ClassB继承ClassA(使用了构造继承法)
    function ClassB(sColor, sName)  //该方法为ClassB的构造函数,所以在使用new关键字进行实例化时,下面的代码全部执行
    {
        this.newMethod = ClassA;  
        this.newMethod(sColor);
        delete this.newMethod;    //记得要删除,否则在子类添加与父类相同名称的方法时,会修改到父类。
        this.sayName = function()
        {
            alert(this.sName);
        }
    }/*至于该程序的执行流程,当然按照下面一步一步的执行*/
    var objA = new ClassA('red');    //这里JS引擎会调用ClassA的构造方法
    var objB = new ClassB('blue','Nicholas'); //这里JS引擎会调用ClassB的构造方法objA.sayColor(); //objA执行自己的sayColor方法
    objB.sayColor(); //objB执行父类的sayColor方法
      

  2.   


    function ClassA(sColor )
    {
        this.color = sColor;
        this.sayColor = function()
        {
            alert(this.color);
        }
    }function ClassB(sColor, sName)
    {
        this.newMethod = ClassA;  //指向对象A的构造函数
        this.newMethod(sColor);   //执行
        delete this.newMethod;    //不需要newMethod,就del   
        this.sayName = function()
        {
            alert(this.sName);
        }
    }var objA = new ClassA('red'); //创建A的实例
    var objB = new ClassB('blue','Nicholas');//执行B的构造函数,这里就是条用Function ClassB, delete this.newMethod;也在这个时候执行了。
    objA.sayColor();
    objB.sayColor(); //B是继承了A了,执行A的sayColor函数,但是里面的this是指向classB的
      

  3.   


    function ClassA(sColor )
    {
        this.color = sColor;
        this.sayColor = function()
        {
            alert(this.color);
        }
    }function ClassB(sColor, sName)
    {
        this.newMethod = ClassA;  
        this.newMethod(sColor); 
        delete this.newMethod;    //实例化一个ClassB的时候会运行
        this.sayName = function()
        {
            alert(this.sName);
        }
    }
    //以上两个类内部方法都是在实例化时运行, 解析时只解析构造方法, 并不执行var objA = new ClassA('red');    //建立一个ClassA类: {color: 'red', sayColor:function(){xxx}}
    var objB = new ClassB('blue','Nicholas');//同理建立一个ClassB类它没有newMethod, 因为第三句删了, 但是因为第一句, 它继承了ClassA, 所以它有color和sayColor: {color:'red', sayColor: function(){xxx}, sayName: function(){xxx}}; 如果不delete, 那么还会有个newMethod: ClassA('red')
    objA.sayColor();
    objB.sayColor(); 
    //以上两句都能调用不知解释清楚没