类A被实例化为一个对象,该对象具有一个名为this.people的数组,该数组中填充了一组数据。类A实例化一个类B的对象,并将this.people传递给它的构造函数。如果对象B更新了数组,那么当对象A更新数组时,它会覆盖对象B的更改。我该如何解决这个问题?
发布于 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))进行深度复制
代码片段:
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
发布于 2020-01-20 07:03:04
为每个类提供其自己版本的people
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)
发布于 2020-01-20 07:03:54
使用destructuring按值传递数组。
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"]
https://stackoverflow.com/questions/59815126
复制相似问题