如何使用ES6克隆Javascript类实例。
我对基于jquery或$extend的解决方案不感兴趣。
我看到过关于对象克隆的古老讨论,这些讨论表明这个问题相当复杂,但对于ES6,一个非常简单的解决方案出现了-我将把它放在下面,看看人们是否认为它是令人满意的。
编辑:有人建议我的问题是重复的;我看到了那个答案,但它已经有7年的历史了,而且涉及到使用ES6之前的js的非常复杂的答案。我建议我的问题,考虑到ES6,有一个简单得多的解决方案。
发布于 2017-06-27 21:49:53
这很复杂,我试了很多!最后,这一行代码适用于我的自定义ES6类实例:
let clone = Object.assign(Object.create(Object.getPrototypeOf(orig)), orig)
它避免了设置原型,因为他们说它大大降低了代码的速度。
它支持符号,但不适合getter/setter,并且不能处理不可枚举的属性(请参见Object.assign() docs)。此外,克隆基本内部类(如数组、日期、RegExp、映射等)可悲的是,似乎常常需要一些单独的处理。
结论:它是一团糟。让我们希望有一天会有一个原生的和干净的克隆功能。
发布于 2017-01-05 07:30:48
const clone = Object.assign( {}, instanceOfBlah );
Object.setPrototypeOf( clone, Blah.prototype );
请注意Object.assign:它进行浅层复制,不复制类方法。
如果您想要一个深度副本或对副本有更多的控制,那么有
发布于 2020-11-26 23:13:37
我喜欢几乎所有的答案。我遇到了这个问题,为了解决它,我将通过定义一个clone()
方法,在其中,我将从头开始构建整个对象。对我来说,这是有意义的,因为产生的对象自然会与克隆对象具有相同的类型。
typescript示例:
export default class ClassName {
private name: string;
private anotherVariable: string;
constructor(name: string, anotherVariable: string) {
this.name = name;
this.anotherVariable = anotherVariable;
}
public clone(): ClassName {
return new ClassName(this.name, this.anotherVariable);
}
}
我喜欢这个解决方案,因为它看起来更像是“面向对象的”。
https://stackoverflow.com/questions/41474986
复制相似问题