首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何克隆javascript ES6类实例

如何克隆javascript ES6类实例
EN

Stack Overflow用户
提问于 2017-01-05 07:30:48
回答 8查看 55.9K关注 0票数 114

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

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

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

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

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2017-06-27 21:49:53

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

代码语言:javascript
运行
复制
let clone = Object.assign(Object.create(Object.getPrototypeOf(orig)), orig)

它避免了设置原型,因为他们说它大大降低了代码的速度。

它支持符号,但不适合getter/setter,并且不能处理不可枚举的属性(请参见Object.assign() docs)。此外,克隆基本内部类(如数组、日期、RegExp、映射等)可悲的是,似乎常常需要一些单独的处理。

结论:它是一团糟。让我们希望有一天会有一个原生的和干净的克隆功能。

票数 141
EN

Stack Overflow用户

发布于 2017-01-05 07:30:48

代码语言:javascript
运行
复制
const clone = Object.assign( {}, instanceOfBlah );
Object.setPrototypeOf( clone, Blah.prototype );

请注意Object.assign:它进行浅层复制,不复制类方法。

如果您想要一个深度副本或对副本有更多的控制,那么有

lodash clone functions.

票数 17
EN

Stack Overflow用户

发布于 2020-11-26 23:13:37

我喜欢几乎所有的答案。我遇到了这个问题,为了解决它,我将通过定义一个clone()方法,在其中,我将从头开始构建整个对象。对我来说,这是有意义的,因为产生的对象自然会与克隆对象具有相同的类型。

typescript示例:

代码语言:javascript
运行
复制
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);
    }
}

我喜欢这个解决方案,因为它看起来更像是“面向对象的”。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41474986

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档