javascript - 深度克隆类实例 JavaScript

标签 javascript ecmascript-6

我试图找出一种方法来深度克隆 JS 类实例,同时保留链中的所有原型(prototype)。
我已经看到了如何深度克隆一个对象:

JSON.parse(JSON.stringify(instance))
而且我已经看到了如何制作类实例的浅拷贝:
Object.assign( Object.create( Object.getPrototypeOf(instance) ), instance)
但我的问题是,有没有办法深度克隆一个类的实例?

最佳答案

没有万无一失的方法可以在 JS 中克隆所有可能类型的对象,尤其是当它包含对其他对象的引用时。通用克隆参数不知道克隆中的对象引用是否应该包含相同的引用(例如公共(public)父级),或者它是否需要克隆我也有引用的对象。一般不可能知道这一点,因为它实际上取决于对象的实现。
如果存在对对象的循环引用,例如父对子和子对父对象,则情况会变得更加复杂。
作为另一个示例,想象一个对象作为其构造函数的一部分,它创建一个唯一的对象 ID,将该 ID 注册到某个服务,然后将该 ID 存储在其实例数据中。通用克隆机制无法知道创建新对象所需的逻辑(生成新 ID 并将其注册到某些服务)。这种类型的逻辑必须由特定于知道该做什么的对象的代码来完成。
作为另一个示例,构造函数可能会创建无法从外部复制的闭包(可以访问私有(private)信息)。
作为另一个示例,构造函数可能会将方法绑定(bind)到它自己的实例,而通用克隆不知道它需要这样做。
克隆对象的最佳方法是使用对象实现中内置的代码,该代码知道如何克隆自身,例如添加 .clone()对象本身的方法(或任何您想要的名称)并让对象支持复制自身。然后,它可以对只有对象实现本身知道如何处理所有可能类型的实例数据的任何实例数据做正确的事情。

关于javascript - 深度克隆类实例 JavaScript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57542052/

相关文章:

javascript - 关键字 "this"进入eventHandler函数,运行到类中

javascript - 追加函数中的动态返回值

javascript - Visual Studio 中使用的这个 JavaScript 引用语法是什么?

javascript - 在类中使用 getter 和 setter 的无限循环

javascript - React 组件 require.default 未定义

javascript - 导入 React,{Component} 而不仅仅是 React 有什么好处?

javascript - Jquery无法改变div的left属性

javascript - 如何在 QML 中的 50 个文本字段之间切换焦点?

javascript - 用javascript编写SDK

javascript - 在 Javascript 生成器函数中设置键