我试图运行这段代码,并能够在“内存”数组中“保存”一个对象,以查看该对象更改后的过去属性。
这是一堂课:
class Circle {
radius;
center = {};
memory = [];
constructor(radius, x, y) {
this.radius = radius;
this.center.x = x;
this.center.y = y;
moveX(steps) {
if (!isNaN(steps)) {
this.saveMemory(this);
this.center.x += steps;
}
return this.center.x;
}
saveMemory(circle) {
let temp = (({ memory, ...rest }) => rest)(circle);
this.memory.push(temp);
}
当我查看内存数组时,它会在更改之后显示对象x。
var circle1 = new Circle(5, 1, 1);
circle1.moveX(2); // memory = [{radius:5,center{x:3,y:1})
如何在更改之前保存对象?
编辑:我想得到:
circle1.moveX(2); // memory = [{radius:5,center{x:1,y:1})
发布于 2020-01-14 20:28:25
class Circle {
radius;
center = {};
memory = [];
constructor(radius, x, y) {
this.radius = radius;
this.center.x = x;
this.center.y = y;
}
moveX(steps) {
if (!isNaN(steps)) {
this.saveMemory();
this.center.x += steps;
}
return this.center.x;
}
saveMemory() {
let { memory, ...rest } = this;
this.memory.push(JSON.parse(JSON.stringify(rest)));
}
}
var circle1 = new Circle(5, 1, 1);
circle1.moveX(2); // memory = [{radius:5,center{x:3,y:1})
circle1.moveX(6);
console.log(circle1.memory)
下面是一个使用JSON.stringify()
创建类属性深度克隆的工作实现。即使是浅层克隆,存储在memory
中的值也将是对圆形对象的引用,而不是复制的数据。据我所知,这是最好的方法,尽管我希望有人纠正我。处理JS类的细微差别之一。
还有其他的克隆方案,如概述的here,但总的来说,这整个克隆的东西糟透了。
发布于 2020-01-14 20:32:24
这是因为您保存和更新的对象的引用是相同的。您需要将一个克隆的对象存储到内存中。
var clonedObj = Object.assign({}, yourObj);
this.saveMemory(clonedObj);
这会做好你的工作!
https://stackoverflow.com/questions/59741281
复制相似问题