原型虽然在某种程度上带来很大方便,但也存在一些问题,其问题是由它共享的本质所导致的。
我们知道,原型中的属性是可以被实例共享的,这种共享对于函数非常合适不过,但对于属性就要另当别论了。如果如果属性的值为基本类型数据,其共享的特点也能说得过去,而属性的值为引用数据类型时,问题就很明显,比如下面的例子。
function P(){
};
P.prototype={
name:“张三”;
friends:["Tom","Jerry"]
};
var p1 = new P();
var p2 = new P();
p1.name = "李四"
p1.friends.push("Mike");
alert(p1.name); //"李四"
alert(p1.name); //"张三"
alert(p1.friends); //["Tom","Jerry","Mike"]
alert(p2.friends); //["Tom","Jerry","Mike"]
在此例中,构造函数P的原型中有一个friends属性,指向一个叫["Tom","Jerry"]的数组。接着创建了p1和p2两个实例,然后修改p1的friends属性,给数组添加了一成员“Mike”,由于数组存在P.prototype当中,而不是p1中,
····待续
时间: 2024-10-26 20:49:20