var a=function(){
//empty
}
a.prototype.var1=[1,2,3];
var b=new a();
b.var1.push(4);
var c=new a();
alert(c.var1.join(","))
最后输出的是1,2,3,4 非常不解?
给实例b push的4,
为什么实例c 会输出4 ,又不是b.prototype.var1.push(4);
话说为什么改成b.prototype.var1.push(4);
会爆一个Uncaught TypeError: Cannot read property 'var1' of undefined(…)
第一个问题,因为
b
实例(也就是new a()
,也可以说是a
的实例)上并没有var1
属性,b.var1
在b
上找不到var1
这个属性,就去b
的父原型——a.prototype
上找,找到了,因此b.var1
实质上是指向a.prototype.var1
。你在b.var1
作修改对象的操作(如数组的push
或者添加、删除属性)都是直接操作在a.prototype
;第二个问题,
.prototype
是函数上的属性(这里特指构造函数),实例上是没有prototype
属性的;如果要在b
的父原型上进行操作,应该:但这样都会影响到
a
的新实例(也就是c
),如果想每个实例都有自己的var1
数组,可以: