如何克隆 javascript ES6 类实例

如何使用ES6克隆Javascript类实例。

我对基于jquery或$extend的解决方案不感兴趣。

我看过关于对象克隆的相当古老的讨论,这表明这个问题非常复杂,但是对于ES6,出现了一个非常简单的解决方案 - 我将把它放在下面,看看人们是否认为它是令人满意的。

编辑:有人建议我的问题是重复的;我看到了这个答案,但它已经有7年的历史了,并且涉及使用ES6 js之前的非常复杂的答案。我建议我的问题,允许ES6,有一个非常简单的解决方案。


答案 1

它很复杂;我试了很多!最后,这个单行代码适用于我的自定义 ES6 类实例:

let clone = Object.assign(Object.create(Object.getPrototypeOf(orig)), orig)

它避免了设置原型,因为他们说这会大大减慢代码的速度。

它支持符号,但不适合 getters/setters,并且不能使用不可枚举的属性(请参阅 Object.assign() docs)。此外,可悲的是,克隆基本的内部类(如数组,日期,正则表达式,Map等)似乎经常需要一些单独的处理。

结论:这是一团糟。我们希望有一天会有一个本机和干净的克隆功能。


答案 2
const clone = Object.assign( {}, instanceOfBlah );
Object.setPrototypeOf( clone, Blah.prototype );

请注意 Object.assign 的特征:它执行浅层复制,不复制类方法。

如果您想要深度副本或对副本进行更多控制,则可以使用lodash克隆功能