今天碰到了个问题,如下
function s(){}; s.prototype={ _cols:[], drawTitle:function(titles){ for(var j=0;j<titles.length;j++){ this._cols[j]=titles[j]; } } } var a=new s(); alert(s.prototype._cols.length) a.drawTitle([1,2,3]); alert(s.prototype._cols.length)
原型的数组类型的属性被改变了!
原型的属性是不变的,而且所有实例共享。当new一个实例a出来,访问实例的a._cols属性,可是它并不存在,所以顺着原型链向上找,找到了s.prototype._cols。这个时候就体现了原型属性的共享。当你给a._cols赋值时,因为a._cols并不存在,所以就创建了一个a._cols属性并给它赋值,你以后再访问a._cols时,就是访问的实例a的_cols属性,此时就体现了原型属性的不变。
赋值的时候,是给a._cols[j]赋值,而不是a._cols。
所以如果要完成这次赋值,按道理是分两步的:
首先创建一个a._cols = [];
然后是添加一个成员并赋值 a._cols[j] = xxxx;
可是电脑没那么聪明,因此就直接找到己有的能够访问的s.prototype._cols并给它添加了一个成员并赋值;