JavaScript中的原型
每个创建的函数都有一个prototype(原型)属性,这个属性是一个指针,指向一个对象,这个对象包含所有该函数指定的类型的共享属性和方法。
function Person(){
}
Person.prototype = {
name : "Gul’dan"
age : 18,
sayHello : function(){
alert("Hi!");
}
};
var test = new Person();
test.sayHello();// Hi!
alert(test.name);// "Gul’dan"
实例向name中添加不同的名字会覆盖原型属性的名字。
alert(test.name);// "Gul’dan"
test.name = "Anduin Llane Wrynn";
alert(test.name);// "Anduin Llane Wrynn"
原型的动态性
先创建实例再创建原型不影响实例调用原型的属性和方法。
var test2 = new Person();
Person.prototype.sayBye = function(){
alert("Bye");
}
test2.sayBye();// "Bye"
原型属性不能包含引用类型值
当原型属性中有引用类型值时,就不能像上文重新赋值name那样了。一个实例改变了带有引用类型的属性时,所有实例的该属性都会变化。想要解决这个问题只要利用构造函数模式和原型模式结合使用就好了。
function Person(name,age){
this.name = name;
this,age = age;
this.friends = ["Shelby","Tommi"]
}
Person.prototype = {
constructor : Person,
game : "World of Warcraft"
sayName : function(){
alert(this.name);
}
}
var p1 = new Person("Gul’dan", 109);
var p2 = new Person("Anduin", 18);
p1.friends.push("Van");
alert(p1.friends);// "Shelby,Tommi,Van"
alert(p2.friends);// "Shelby,Tommi"