zoukankan      html  css  js  c++  java
  • [转]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);//输出“改名了”
    
  • 相关阅读:
    ZeptoLab Code Rush 2015
    UVa 10048 Audiophobia【Floyd】
    POJ 1847 Tram【Floyd】
    UVa 247 Calling Circles【传递闭包】
    UVa 1395 Slim Span【最小生成树】
    HDU 4006 The kth great number【优先队列】
    UVa 674 Coin Change【记忆化搜索】
    UVa 10285 Longest Run on a Snowboard【记忆化搜索】
    【NOIP2016提高A组模拟9.28】求导
    【NOIP2012模拟10.9】电费结算
  • 原文地址:https://www.cnblogs.com/wxxweb/p/2016591.html
Copyright © 2011-2022 走看看