You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dart如何实现对象拷贝且不产生引用关联

问题原因

你当前的写法属于引用赋值,仅拷贝了item1的内存地址赋值给item2,两个变量实际指向堆内存中的同一个对象实例,因此修改任意一个的属性都会同步影响另一个。

要实现两个完全无关联的独立对象,需要做对象拷贝,根据对象结构可选以下两类方案:


方案1:浅拷贝

仅拷贝对象的第一层属性,仅适用于Item类的所有属性都是基础数据类型(无嵌套对象、数组、集合等引用类型属性)的场景:

  • Java 实现:让Item类实现Cloneable接口,重写clone()方法,调用时写为:
    Item item2 = item1.clone();
    
  • JavaScript 实现:可以用展开语法或Object.assign:
    // 展开语法
    const item2 = {...item1}
    // Object.assign 写法
    const item2 = Object.assign({}, item1)
    
  • Python 实现:调用copy模块的浅拷贝方法:
    import copy
    item2 = copy.copy(item1)
    

方案2:深拷贝

会递归拷贝对象所有层级的属性,包括嵌套的引用类型属性,拷贝后的两个对象完全无关联,适用于所有场景:

  • Java 实现:可通过序列化/反序列化实现,比如将对象写入字节流后再读取生成新实例,也可以手动递归拷贝所有嵌套属性
  • JavaScript 实现:无特殊属性(函数、Symbol、循环引用)的场景可以直接用JSON序列化反序列化:
    const item2 = JSON.parse(JSON.stringify(item1))
    
    有特殊属性的场景可以自己实现递归拷贝逻辑即可
  • Python 实现:调用copy模块的深拷贝方法:
    import copy
    item2 = copy.deepcopy(item1)
    

内容的提问来源于stack exchange,提问作者Mohammad Alamoudi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 06:45:03