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 在打印一下这个类:
Prototype就是Male类的原型,他指向Person;
点开这个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