首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何让两个对象访问同一个数组?

如何让两个对象访问同一个数组?
EN

Stack Overflow用户
提问于 2020-01-20 06:49:52
回答 3查看 73关注 0票数 0

类A被实例化为一个对象,该对象具有一个名为this.people的数组,该数组中填充了一组数据。类A实例化一个类B的对象,并将this.people传递给它的构造函数。如果对象B更新了数组,那么当对象A更新数组时,它会覆盖对象B的更改。我该如何解决这个问题?

EN

回答 3

Stack Overflow用户

发布于 2020-01-20 07:03:30

这是因为您将A的people数组的引用传递给B的构造函数。您希望对A的people数组进行“浅拷贝”或“深拷贝”,因为您希望B的people数组内容不同。

使用“浅复制”可以将数组中的所有原始值复制到新的原始值中,但是如果数组中有复合值(数组或对象),则只会复制对它们的引用,因此对复合值所做的任何更改都将反映在A和B中。使用“深复制”时,原始值和复合值(而不仅仅是它们的引用)都将被复制到内存中的新位置。

如果people数组中没有对象和数组,可以使用Array.from(a.people)进行浅层复制。否则,您可以使用JSON.parse(JSON.stringify(a.people))进行深度复制

代码片段:

代码语言:javascript
运行
复制
class B {
  constructor(_people) {
    // shallow copy:
    this.people = Array.from(_people);

    // deep copy:
    //this.people = JSON.parse(JSON.stringify(_people));
  }
}
class A {
  constructor() {
    this.people = [];
  }
  func() {
    this.objB = new B(this.people);
    //do something
  }
}

// Usage Example
let objA = new A();
objA.people.push("A");
objA.func();
objA.objB.people.push("B");
console.log(objA.people.toString());
console.log(objA.objB.people.toString());

一些有用的链接:https://medium.com/@gamshan001/javascript-deep-copy-for-array-and-object-97e3d4bc401a

https://dev.to/samanthaming/how-to-deep-clone-an-array-in-javascript-3cig

票数 0
EN

Stack Overflow用户

发布于 2020-01-20 07:03:04

为每个类提供其自己版本的people

代码语言:javascript
运行
复制
class A{
    constructor(){
        this.people = ["bob","jane","john"]
        this.objB = new B(this.people)   
    }
}

class B{
    constructor(people){
        this.people = people
    }
}

let objA = new A()
objA.objB.people.push("a")
objA.people.push("b")
console.log(objA.people, objA.objB.people)

票数 -1
EN

Stack Overflow用户

发布于 2020-01-20 07:03:54

使用destructuring按值传递数组。

代码语言:javascript
运行
复制
class Family {
  constructor(people) {
    this.people = people;
  }
}

let members = ["mom", "dad"];

let smiths = new Family(members);
let joneses = new Family(smiths.people); // pass by reference

joneses.people.push("Billy");
console.log(smiths.people); // changes to ["mom","dad","Billy"]

let wilsons = new Family([...smiths.people]); // pass by value

wilsons.people.push("Suzy");
console.log(smiths.people); // remains ["mom","dad","Billy"]

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

https://stackoverflow.com/questions/59815126

复制
相关文章

相似问题

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