原型对象的理解
当创建了一个函数,就会就这个函数创建一个prototype属性,这个属性指向函数的原型对象。
这时,原型对象会获得一个constructor属性,这个属性有一个指针,这个指针指向prototype所在的函数。
当调用构造函数创建一个实例后,这个实例包含一个指针,指针指向函数的原型对象。这个指针叫[[prototype]]
例子:
function Person(){
}
person.prototype.name="Tom",
person.prototype.age=29,
person.prototype.show=function(){
alert(this.name);
}
var person1==new Person();
person1.show();//Tom
var person2==new Person();
person2.show();//Tom
alert(person1.show()==person2.show());//true
把show()和属性添加到了Person的prototype 属性中,构造函数成了空函数,虽然是空,也可以通过调用构造函数来创建新对象。并且新函数具有相同的属性和方法。新对象的属性和方法是由所有实例共享的。
但是不能通过对象实例重写原型中的值。假设在实例中添加了一个属性,这个属性和原型中一个属性重名,那就在实例中创建该属性,不会影响到原型中的属性。function Person(){
}
person.prototype.name="Tom",
person.prototype.age=29,
person.prototype.show=function(){
alert(this.name);
}
var person1==new Person();
var person2==new Person();
person1.name="lily";
alert(person1.show());//lily
alert(person2.show());//Tom
原因:当alert()访问到person1.name时,先在实例上搜索叫name的属性,找到了,就返回该值,找不到就继续向原型搜索了。而person2.name需要搜索到原型才会找到name。
但是使用delete删除了实例属性,可以重新访问原型中的属性。
function Person(){
}
person.prototype.name="Tom",
person.prototype.age=29,
person.prototype.show=function(){
alert(this.name);
}
var person1==new Person();
var person2==new Person();
person1.name="lily";
alert(person1.show());//lily
alert(person2.show());//Tom
delete person1.name;alert(person1.show());//Tom
但是原型模式也有自己缺点,他省略了为构造函数传递参数这个环节。结果所有实例默认情况下取得相同的属性值。
最大的问题还是共享引起。如果原型中一个属性包含引用类型值。例如一个数组,当通过一个实例往数组里添加一个元素时,就会影响所有的实例。这就是共享导致的。
function Person(){
}
person.prototype.name="Tom",
person.prototype.age=29,
person.friend=["wang","du"],
person.prototype.show=function(){
alert(this.name);
}
var person1==new Person();
var person2==new Person();
person1.friend.pudh("liu");
alert(person1.friend);//wang,du,liu
alert(person2.friend);//wang,du,liu
上述为自己理解,哪里不对,还请您给予改正。谢谢。