• [转]ActionScript3.0对象深复制


    先来看下面的代码:

    var initialObj:Object=new Object();
    initialObj.name="名字";
    
    var afterObj:Object=initialObj;
    afterObj.name="改名了";
    trace("initialObj的名字:"+initialObj.name);//输出“改名了”
    trace("afterObj的名字:"+afterObj.name);//输出“改名了”
    

    如果是新手,可能你会紧张的发现initialObj的名字也变成了"改名了",但并没有更改过他的名字啊。

    首先要知道的是AS3里总的分为两种数据类型——基元数据类型也叫原始数据类型和复杂数据类型也叫引用数据类型,具体是什么可以到网上查下相关资料,如果网上资料不多,过完年我会回来补上。
    因为Object是一个复杂数据类型把initialObj赋值给afterOb(就是这行var afterObj:Object=initialObj;)其实是把initialObj和afterOb指向内存中的同一地址,所以改变了afterObj,initialObj也改变了。
    如何复制一个和initialObj一模一样的对象,而更改复制的对象又不影响initialObj呢,就要用到下面的复制方法,统称“深复制”。
    //声明一个Object类型的变量initialObj,并添加一个名为name的属性,属性值为“名字”
    var initialObj:Object=new Object();
    initialObj.name="名字";
    
    //声明ba并把initialObj写入到ba中,也就是使用二进制数据存储initialObj
    var ba:ByteArray=new ByteArray();
    ba.writeObject(initialObj);
    ba.position=0;
    
    //声明afterObj并从ba读取initialObj,其实读取的是和initialObj长的一模一样的一个对象,并不是initialObj
    var afterObj:Object=ba.readObject();
    afterObj.name="改名了";
    trace("initialObj的名字:"+initialObj.name);//输出“名字”
    trace("afterObj的名字:"+afterObj.name);//输出“改名了”
    
  • 相关阅读:
    BZOJ 1021 循环的债务
    BZOJ 1019 汉诺塔
    BZOJ 1018 堵塞的交通
    BZOJ 1017 魔兽地图
    BZOJ 1016 最小生成树计数
    Luogu 3008 [USACO11JAN]道路和飞机Roads and Planes
    Luogu 3625 [APIO2009]采油区域
    Luogu 4139 上帝与集合的正确用法
    Luogu 3629 [APIO2010]巡逻
    Luogu 3626 [APIO2009]会议中心
  • 原文地址:https://www.cnblogs.com/wxxweb/p/2016591.html
Copyright © 2020-2023  润新知