如何复制一个对象的实例 Object.create

class Person {

    name = '小明';
    age = 12;

    constructor() {
        console.log("我是Person类");
    }

    copy() {
        let shallowCopy = Object.assign(Object.create(null), this);   // 复制属性
        Object.setPrototypeOf(shallowCopy, Object.getPrototypeOf(this));
        return shallowCopy
    }
}

class Male extends Person {
    constructor() {
        super();
        console.log("我是Male类");
    }
}

class Female extends Person {
    constructor() {
        super();
        console.log("我是Female类");
    }
}

const male = new Male();
console.log(male, "male");

const male2 = male.copy();
console.log(male2, "male2"); 作者:_前端の神_ https://www.bilibili.com/read/cv39430850/ 出处:bilibili

基类中我们定义了一个copy方法.用于复制对象,并且如果是Male的实例复制,他就复制Male, Female的实例他就复制Female;

copy方法的第一行代码,我们使用Object.create(null) 创建了一个很纯净的对象(你可以自己打印下),没有属性,也没有原型;,我们把当前实例的属性合并到这个空对象里面去Object.assign;

copy方法的第二行代码,我们使用Object.getPrototypeOf(this) 获取当前实例的原型

(这个this是谁,谁调用的就是谁,比如是Male的实例调用他就是Male类;Person类调用他就是Person;)

再通过Object.setPrototypeOf将原型设置到shallowCopy上,那么这个shallowCopy就是我们复制的一个新的类了,类型与this当前实例一致;

啥是原型,我们先new 一下Male 在打印一下这个类:


image.png

Prototype就是Male类的原型,他指向Person;


image.png

点开这个Prototype 我们可以看到Male的构造器就是Male;

所以我们通过setPrototypeOf 将一个普通对象的原型设置的与某个实例的原型一致,那么这两个类就是相同类型了!

同时我们第一行代码 通过 Object.assign 把当前this的属性合过去了,所以属性也相当于复制过去了,实现整个类的copy,但是注意如果某些属性是对象,那么他是引用类型,改变这个对象的属性会影响到原来的类,所以copy方法的第一行中我还会使用深克隆去复制属性:

Object.assign(Object.create(null), deepClone(this));

deepClone你可以去网上找封装的方法;

最后如果你这个属性不是简单的对象,比如是另一个类,或者dom元素,那你可能需要进一步处理

作者:前端の神 https://www.bilibili.com/read/cv39430850/ 出处:bilibili

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容