原型的动态性
对原型对象所做的任何修改都能立即从实例上反映出来——即使是先创建了实例后修改原型也照样如此。
function Person(){
}
Person.prototype={
name:"Nicholas",
age:29,
job:"Software Engineer",
sayName:function(){
alert(this.name);
}
};
var friend=new Person();
//原型的动态性
Person.prototype.sayHi=function(){
alert("hi");
}
friend.sayHi();//"hi"
如代码所示,即使是在实例之后修改原型,friends仍然可以访问到该属性。实例与原型之间的连接只不过是一个指针,而非一个副本。尽管可以随时为原型添加属性和方法,但如果重写原型,那么情况会有所不同。重写原型对象切断了现有原型与任何之前已经存在的对象实例的联系;它们引用的仍然是最初的原型。
function Person(){
}
var friend=new Person();
Person.prototype={
name:"Greg",
age:29,
job:"Software Engineer",
sayName:function(){
alert(this.name);
}
};
friend.sayName();//error
此时返回错误,因为此时原来的原型里面没有sayName属性。同理,下面的例子讲返回“Nicholas”。
function Person(){
}
Person.prototype={
name:"Nicholas",
age:29,
job:"Software Engineer",
sayName:function(){
alert(this.name);
}
};
var friend=new Person();
Person.prototype={
name:"Greg",
age:29,
job:"Software Engineer",
sayName:function(){
alert(this.name);
}
};
friend.sayName();//Nicholas
小结:可以修改原型属性和方法,无论是在对象实例的前后。但不可以重写原型,此时对象实例仍然指针指向原来的原型,即创建的原型一定要在对象实例之前才会起作用。如果创建的两个原型都在对象实例之前,后面的一个会起作用。
function Person(){
}
Person.prototype={
name:"Nicholas",
age:29,
job:"Software Engineer",
sayName:function(){
alert(this.name);
}
};
Person.prototype={
name:"Greg",
age:29,
job:"Software Engineer",
sayName:function(){
alert(this.name);
}
};
var friend=new Person();
friend.sayName();//Greg