在 Javascript 中克隆扩展 objects,保留所有父亲的方法
Cloning extended objects in Javascript, keeping all father's methods
我无法在JS中实现完整且令人满意的克隆方法。
我有这个父亲class,有属性和方法,当然每次派生class都必须访问这样父亲的方法
class Father {
constructor() {
this.fatherProp = 1;
}
fatherMethod() {
console.log('father method');
}
}
和这个 child class,它扩展了前一个
class Child extends Father {
constructor() {
super();
this.childProp = 2;
}
}
客户端代码工作正常
let child1 = new Child();
console.log(child1); // CONSOLE: Child {fatherProp: 1, childProp: 2}
child1.fatherMethod(); // CONSOLE: father method
然后,我需要克隆 child object,当然要保持所有相同的 father/child classes 结构、属性和方法。所以我在Father class
中添加了一个clone方法
class Father {
constructor() {
this.fatherProp = 1;
}
fatherMethod() {
console.log('father method');
}
clone() {
let newObject = {};
Object.assign(newObject, this);
return newObject;
}
}
客户端代码有效 so-and-so。
let child2 = child1.clone();
console.log(child2); // CONSOLE: {fatherProp: 1, childProp: 2} *** "Child" type missing
child2.fatherMethod(); // CONSOLE: Uncaught TypeError: child2.fatherMethod is not a function
深入记录两个 objects 我可以看到第一个 child(图片中的蓝色)有 "father" 作为“__proto”。而第二个 object(红色)有空 __proto
这是怎么回事?
在这种情况下,我应该如何克隆 object?
谢谢
您的克隆方法 return 对象而不是 Class,一种方式:
class Father {
constructor() {
this.fatherProp = 1;
}
fatherMethod() {
console.log('father method');
}
clone() {
let clone = Object.assign( Object.create( Object.getPrototypeOf(this)), this);
return clone;
}
}
class Child extends Father {
constructor() {
super();
this.childProp = 2;
}
}
let child1 = new Child();
console.log(child1); // CONSOLE: Child {fatherProp: 1, childProp: 2}
child1.fatherMethod(); // CONSOLE: father method
let child2 = child1.clone();
console.log(child2); // CONSOLE: {fatherProp: 1, childProp: 2} *** "Child" type missing
child2.fatherMethod(); // CONSOLE: Uncaught TypeError: child2.fatherMethod is not a function
我无法在JS中实现完整且令人满意的克隆方法。 我有这个父亲class,有属性和方法,当然每次派生class都必须访问这样父亲的方法
class Father {
constructor() {
this.fatherProp = 1;
}
fatherMethod() {
console.log('father method');
}
}
和这个 child class,它扩展了前一个
class Child extends Father {
constructor() {
super();
this.childProp = 2;
}
}
客户端代码工作正常
let child1 = new Child();
console.log(child1); // CONSOLE: Child {fatherProp: 1, childProp: 2}
child1.fatherMethod(); // CONSOLE: father method
然后,我需要克隆 child object,当然要保持所有相同的 father/child classes 结构、属性和方法。所以我在Father class
中添加了一个clone方法class Father {
constructor() {
this.fatherProp = 1;
}
fatherMethod() {
console.log('father method');
}
clone() {
let newObject = {};
Object.assign(newObject, this);
return newObject;
}
}
客户端代码有效 so-and-so。
let child2 = child1.clone();
console.log(child2); // CONSOLE: {fatherProp: 1, childProp: 2} *** "Child" type missing
child2.fatherMethod(); // CONSOLE: Uncaught TypeError: child2.fatherMethod is not a function
深入记录两个 objects 我可以看到第一个 child(图片中的蓝色)有 "father" 作为“__proto”。而第二个 object(红色)有空 __proto
这是怎么回事? 在这种情况下,我应该如何克隆 object? 谢谢
您的克隆方法 return 对象而不是 Class,一种方式:
class Father {
constructor() {
this.fatherProp = 1;
}
fatherMethod() {
console.log('father method');
}
clone() {
let clone = Object.assign( Object.create( Object.getPrototypeOf(this)), this);
return clone;
}
}
class Child extends Father {
constructor() {
super();
this.childProp = 2;
}
}
let child1 = new Child();
console.log(child1); // CONSOLE: Child {fatherProp: 1, childProp: 2}
child1.fatherMethod(); // CONSOLE: father method
let child2 = child1.clone();
console.log(child2); // CONSOLE: {fatherProp: 1, childProp: 2} *** "Child" type missing
child2.fatherMethod(); // CONSOLE: Uncaught TypeError: child2.fatherMethod is not a function