【问题标题】:Actionscript - Variable Assignment without reference?Actionscript - 没有参考的变量赋值?
【发布时间】:2009-04-06 01:07:57
【问题描述】:

应该很容易。我有一个对象。我想修改它,但在此之前我想保存一份我可以返回的副本。我尝试设置 copy = original 但是当我修改原始属性时,副本也会显示更改。我假设这是因为在您分配的任何时候的动作脚本中,它实际上只是存储对原始对象的引用。那么我存储原始对象的副本以供以后使用的最佳方式是什么?

【问题讨论】:

    标签: actionscript-3 variable-assignment


    【解决方案1】:
    var newObj:Object = Object(ObjectUtil.copy(oldObj));
    

    “复制指定的对象并返回对副本的引用。副本是使用本机序列化技术制作的。这意味着在复制期间将尊重自定义序列化。

    此方法设计用于复制数据对象,例如集合的元素。它不适用于复制 UIComponent 对象,例如 TextInput 控件。如果要创建特定 UIComponent 对象的副本,可以创建组件的子类并实现 clone() 方法或其他方法来执行复制。"

    http://livedocs.adobe.com/flex/3/langref/mx/utils/ObjectUtil.html#copy()

    【讨论】:

      【解决方案2】:

      您正在寻找的是对象的深层副本,而不是通过引用传递。我在这里找到了答案,它使用了 AS3 中的新 ByteArray 类:

      http://www.kirupa.com/forum/showthread.php?p=1897368

      function clone(source:Object):* {
       var copier:ByteArray = new ByteArray();
       copier.writeObject(source);
       copier.position = 0;
       return(copier.readObject());
      

      }

      然后你像这样使用它:

      newObjectCopy = clone(originalObject);
      

      干杯!

      【讨论】:

      • 如果在序列化前注册了类别名,反序列化后可以将对象保留在正确的类中。请参阅 flash.net.registerClassAlias
      【解决方案3】:
       // duplicate any given Object (not MCs)  
       Object.prototype.copy = function()  
       {  
           ASSetPropFlags(Object.prototype,["copy"],1);  
      
           var _t = new this.__proto__.constructor(this) //
      
           for(var i in this){  
               _t[i] = this[i].copy()  
           }  
           return _t  
       };  
      

      用法

      x = ["1","2","3",[4,5],[{a:1,b:2}]]
      
      y = x.copy()
      
      y[0] = 0
      
      y[3][0]="d"
      
      trace(x)
      
      trace(y)
      

      【讨论】:

      • 这是一个糟糕的解决方案,任何稍微复杂的对象都不会被正确复制。此外,添加到 Object 原型并不是一个好的做法。我什至会说在原型中添加任何东西都是不好的做法。它更像是一个遗留物而不是一个功能。
      猜你喜欢
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 2017-02-27
      • 2012-07-23
      • 1970-01-01
      • 1970-01-01
      • 2012-02-04
      • 2017-09-23
      相关资源
      最近更新 更多