程序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段程序的输出为什么会不同?求高人指点。
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段程序的输出为什么会不同?求高人指点。
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的实例.
所以能弹出修改后的原型值.
{
} function B()
{
}
var b=new B();
B.prototype=new A();
B.prototype.z=0;
alert(b.z);一个效果个人感觉是在实例化b后,还设置B的prototype会打断所有b的继承链
{} function B()
{
B.prototype=new A();
}
var b=new B(); B.prototype.z=0; alert(b.z); //undefined
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(); 有什么区别?
B.prototype=new A();刚执行
返回的对象还是B对象.
第二次new B();
B.prototype=new A();已运行
返回对象已经是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
new但是返回的对象仍是B
看constructor就知道.
function B()
{
this.prototype=new 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 ,这又如何解释?
展基类的功能特性。这在静态对象语言中是很难想象的。我们来看下面的代码:
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>>