rihoonet 2008-06-15 21:41
浏览 214
已采纳

对象创建的问题

var TestObject = Class.create();

TestObject.prototype = {
data: new Array(),
initialize: function(){
}
}

var ss = new TestObject();
ss.data.push("AAA");
alert(ss.data.length);

为什么我多次执行
var ss = new TestObject();
ss.data.push("AAA");
alert(ss.data.length);
ss.data.length为增加?也就是说创建的新对象好像重用了data...

  • 写回答

2条回答 默认 最新

  • iteye_17163 2008-06-16 14:15
    关注

    这个问题我已经为你回答过了.再粘贴一遍吧:

    如果使用
    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中的属性指向一个"对象"类型的数据.因为这样的话,会造成这个属性变为全局共享.任何地方的修改都会影响到另一个地方的值.

    如果一定要用的话.
    可以在声明类的时候用:
    Js代码
    function TestObject={

    this.dataa=new Array()

    }

    function TestObject={
    this.dataa=new Array()
    }

    这样,由于作用域的关系,你每次创建TestObject这个类的实例时,都会新建一个Array对象,不会上上面一样,共享同一个Array的对象.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?