程序1:
function A()
{}function B()
{
B.prototype=new A();
}var b=new B();
B.prototype.z=0;
alert(b.z);
程序2:
function A()
{}function B()
{
}B.prototype=new A();
var b=new B();
B.prototype.z=0;
alert(b.z);这2段程序的输出为什么会不同?求高人指点。

解决方案 »

  1.   

    <script>
    function A() 
    {} function B() 

    B.prototype=new A(); 
    } //B.prototype.z=0; 
    var b=new B(); 
    alert(b.constructor);
    B.prototype.z=0; 
    alert(b.z); 
    b=new B(); 
    alert(b.constructor);
    alert(b.z);  
    </script>
    打开注释就能看到B的原型被修改;
    对B的实例有影响.
    而注释时.
    B的原型在运行完B.prototype= new A()后实际已经是A实例
    而b实际上还是B的实例.
    B的原型修改实际只是对作为函数生成的实例A对象的修改
    并不会对B的实例有影响.而第二段代码中;
    B.prototype=new A(); 
    var b=new B(); 
    实际上b已经是A的实例.
    所以能弹出修改后的原型值.
      

  2.   

    程序1和function A() 
    {
    }  function B() 



    var b=new B();

    B.prototype=new A();

    B.prototype.z=0; 

    alert(b.z);一个效果个人感觉是在实例化b后,还设置B的prototype会打断所有b的继承链
      

  3.   

    function A() 
    {} function B() 

    B.prototype=new A(); 

    var b=new B(); B.prototype.z=0; alert(b.z); //undefined
      

  4.   

    <script>
    function A() 
    {} function B() 

    B.prototype=new A(); 
    } //B.prototype.z=0; 
    var b=new B(); 
    alert(b.constructor);
    B.prototype.z=0; 
    alert(b.z); 
    b=new B(); 
    alert(b.constructor);
    alert(b.z);  
    </script>
    var b=new B(); 和 b=new B();  有什么区别?
      

  5.   

    第一次new B();
    B.prototype=new A();刚执行
    返回的对象还是B对象.
    第二次new B();
    B.prototype=new A();已运行
    返回对象已经是A对象了.
      

  6.   

    function A() 
    {} function B() 

    B.prototype=new A(); 
    } B.prototype.z=0; 
    var b=new B(); 
    alert(b.constructor);alert(b.z); //0
    b=new B(); 
    alert(b.constructor);
    alert(b.z); //此时undefined
      

  7.   

    B.prototype=new A();的确是在new B();时执行.
    new但是返回的对象仍是B
    看constructor就知道.
      

  8.   

    程序1中的B改为以下就可以了.
    function B()
    {
    this.prototype=new A();
    }
      

  9.   

    function A() 
    {} function B() 

    B.prototype=new A(); 
    } B.prototype.z=0; 
    var b=new B(); 
    alert(b.constructor); 
    B.prototype.z=0; 
    alert(b.z); //0 
    b=new B(); alert(b.constructor); 
    alert(b.z); //0 ,这又如何解释?
      

  10.   

    js 比静态对象语言更神奇的是,我们可以随时给原型对象动态添加新的属性和方法,从而动态地扩
    展基类的功能特性。这在静态对象语言中是很难想象的。我们来看下面的代码:
    function Person(name)
    {
    this.name = name;
    };
    Person.prototype.SayHello = function() //建立对象前定义的方法
    {
    alert("Hello, I'm " + this.name);
    };
    var BillGates = new Person("Bill Gates"); //建立对象
    BillGates.SayHello();
    Person.prototype.Retire = function() //建立对象后再动态扩展原型的方法
    {
    alert("Poor " + this.name + ", bye bye!");
    };
    24
    BillGates.Retire(); //动态扩展的方法即可被先前建立的对象立即调用
    ----李占<<悟透 JavaScript>>