首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在应用该方法之前,如何在数组中“保存”对象?

在应用该方法之前,如何在数组中“保存”对象?
EN

Stack Overflow用户
提问于 2020-01-14 20:24:48
回答 2查看 158关注 0票数 1

我试图运行这段代码,并能够在“内存”数组中“保存”一个对象,以查看该对象更改后的过去属性。

这是一堂课:

代码语言:javascript
运行
复制
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。

代码语言:javascript
运行
复制
var circle1 = new Circle(5, 1, 1);
circle1.moveX(2); // memory = [{radius:5,center{x:3,y:1})

如何在更改之前保存对象?

编辑:我想得到:

代码语言:javascript
运行
复制
circle1.moveX(2); // memory = [{radius:5,center{x:1,y:1})
EN

回答 2

Stack Overflow用户

发布于 2020-01-14 20:28:25

代码语言:javascript
运行
复制
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,但总的来说,这整个克隆的东西糟透了。

票数 1
EN

Stack Overflow用户

发布于 2020-01-14 20:32:24

这是因为您保存和更新的对象的引用是相同的。您需要将一个克隆的对象存储到内存中。

代码语言:javascript
运行
复制
var clonedObj = Object.assign({}, yourObj);
this.saveMemory(clonedObj);

这会做好你的工作!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59741281

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档