首页 > 解决方案 > 使用 Object.assign 更新对象后,在数组崩溃时调用 push 方法

问题描述

我们从网络接收 JSON,并将数据转换为 TypeScript 中类的对象,以便 getter 和 setter 工作,如下例所示

class Sent {
  id: number

  constructor(model? : Sent){
    if(model){
      Object.assign(this, model);
    }
  }
}

class Email{
  name: string;
  age: number;
  sent: Sent[];

  constructor(model?: Email){
    if(model){
      Object.assign(this, model);
      for(let x of model.sent){
        this.sent.push(new Sent(x))
       }
    }
  }
}

当我们使用 JSON 数据创建一个新对象时,如下例所示,浏览器会崩溃this.sent.push(new Sent(x))

如果我们用它替换push它就concat可以了。

如果我们this.sent在循环之前设置新的空数组,就像这样this.sent = [],那么它也可以

只是想了解为什么push方法在这里崩溃。任何帮助表示赞赏

Stackblitz重新创建问题。

标签: javascripttypescript

解决方案


通过使用Object.assign(this, model);,您只需将两个对象绑定在一起(只要 javascript 对象通过引用传递)。请参阅此代码以获取说明:

obj1 = {}
obj2 = {list: []}
Object.assign(obj1, obj2);
obj2.list.push(1);
console.log(obj1.list);

因此,在将元素添加到第二个对象的属性之后,它会出现在第一个对象中。

让我们回到你的问题。你已经绑定了this对象model。迭代model.send属性,您将元素推送到this.sent实际上与将元素推送到model.send. 因此你得到一个无限循环。


推荐阅读