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) 創(chuàng)建了一個很純凈的對象(你可以自己打印下),沒有屬性,也沒有原型;,我們把當前實例的屬性合并到這個空對象里面去Object.assign;
copy方法的第二行代碼,我們使用Object.getPrototypeOf(this) 獲取當前實例的原型
(這個this是誰,誰調(diào)用的就是誰,比如是Male的實例調(diào)用他就是Male類;Person類調(diào)用他就是Person;)
再通過Object.setPrototypeOf將原型設(shè)置到shallowCopy上,那么這個shallowCopy就是我們復制的一個新的類了,類型與this當前實例一致;
啥是原型,我們先new 一下Male 在打印一下這個類:
Prototype就是Male類的原型,他指向Person;
點開這個Prototype 我們可以看到Male的構(gòu)造器就是Male;
所以我們通過setPrototypeOf 將一個普通對象的原型設(shè)置的與某個實例的原型一致,那么這兩個類就是相同類型了!
同時我們第一行代碼 通過 Object.assign 把當前this的屬性合過去了,所以屬性也相當于復制過去了,實現(xiàn)整個類的copy,但是注意如果某些屬性是對象,那么他是引用類型,改變這個對象的屬性會影響到原來的類,所以copy方法的第一行中我還會使用深克隆去復制屬性:
Object.assign(Object.create(null), deepClone(this));
deepClone你可以去網(wǎng)上找封裝的方法;
最后如果你這個屬性不是簡單的對象,比如是另一個類,或者dom元素,那你可能需要進一步處理
作者:前端の神 https://www.bilibili.com/read/cv39430850/ 出處:bilibili