AS3 - 复制的对象属性:引用还是值?

时间:2014-06-03 23:46:00

标签: actionscript-3

(在AS3中)我知道当我复制字典时,它会创建一个浅拷贝,我可以在不影响原件的情况下进行修改。
如果我创建了一个对象的副本,我可以修改副本的属性而不影响原始属性吗?

2 个答案:

答案 0 :(得分:4)

它取决于属性类型,如果它是一个不可变的值,比如字符串就可以,但如果它是一个对象,那么你必须使用深层复制。

如果你想要一个你可以修改的对象的深层副本而不改变原来的make一个util类并声明这个方法

private function clone(obj:Object):Object {
    var temp:ByteArray = new ByteArray();
     temp.writeObject(obj);
     temp.position = 0;
     return temp.readObject();
}

请注意,如果您使用的是Flex,则可以使用ObjectUtil.copy()


更新:另请注意,DisplayObject实例(或继承的类实例)几乎无法进行深度复制。

答案 1 :(得分:1)

不,你不能。但是你可以使用:

ObjectUtil.clone(object);

缺点是您无法克隆UIComponents

文档说:

克隆指定的Object并返回对该克隆的引用。克隆使用本机序列化技术制作。这意味着在克隆过程中将遵循自定义序列化。 clone()与copy()的不同之处在于保留了每个对象实例的uid属性。 此方法用于克隆数据对象,例如集合的元素。它不用于克隆UIComponent对象,例如TextInput控件。如果要克隆特定的UIComponent对象,可以创建组件的子类并实现clone()方法。