问题描述
var TestObject = Class.create();TestObject.prototype = { data: new Array(), initialize: function(){ }}var ss = new TestObject();ss.data.push("AAA");alert(ss.data.length);为什么多次执行(总是创建新对象后,向对象data数组里,加入一条数据)var ss = new TestObject();ss.data.push("AAA");alert(ss.data.length);ss.data.length会增加,按理说应该都是1才对吧?问题补充:那怎么样才能不对象共享呢?
解决方案
如果使用TestObject.prototype.data=new Array();给它的data赋值的话.相当于创建了一个全局变量(假设说它的名字为temp),temp=new Array();然后TestObject,prototype.data=temp;因为temp是一个"对象".所以TestObject,prototype.data的值实际上是类似于C语言中的指针,指向了new Array()的地址.所以,当你使用ss.data.push("AAA");之后,实际上是push到了temp这个全局变量中.因为其它的TestObject对象中的data全都是共享了temp这个变量.所以只要修改其中一个,其它的都会受影响.但如果用一个普通的值类型变量,如一个数字123,或一个字符串"test",不管怎么修改都不会出错了.建议楼主在不要随便让prototype中的属性指向一个"对象"类型的数据.因为这样的话,会造成这个属性变为全局共享.任何地方的修改都会影响到另一个地方的值.如果一定要用的话.可以在声明类的时候用:function TestObject={ this.dataa=new Array()}这样,由于作用域的关系,你每次创建TestObject这个类的实例时,都会新建一个Array对象,不会上上面一样,共享同一个Array的对象.
解决方案二:
prototype对象里面的方法和对象其实是各个实例化对象共享的,所以其实都改变了data的值