我在对象构造函数中有一个函数,它改变了该构造函数创建的所有对象。我不确定为什么。有人可以看看我的代码并告诉我我缺少什么吗?
快速描述正在发生的事情:
警告!通读代码可能比试图理解我的描述更容易
我创建了两个新数组。第一个称为foos
,它将是一个对象数组,foo
每个对象都包含一个bar
对象数组。第二个被称为它是可添加到bars
数组中的所有对象的数组。bar
foos.foo.bars
foo
当使用对象构造函数创建一个新对象时foo
,它会被赋予两个参数(aBars,bBars
)。是要包含在对象aBars
中的所有对象的数组。是所有包含对象的数组,这些对象以某种方式被认为是“特殊的”。在构造函数中,有一个函数遍历数组中的每个对象,如果它的名称值与参数中的字符串匹配,则将其添加到数组中。如果它的名称值与参数中的字符串匹配,则将其属性设置为 true,否则设置为 false。bar
foo
bBars
bar
bars
aBars
foo.bars
bBars
bBar
我遇到的问题是,在第二个foo
对象构造函数中,当 bar 对象将 bBar 设置为 true 或 false 时,它还会更改所有其他foo.bars
对象中该对象中的该值。
我意识到这可能很难理解。对不起,这是一天的结束。
找到了我自己的答案!
我才意识到问题出在哪里。foos[0].bars[4]
并且foos[1].bars[3]
不是单独的对象,它们只是指向同一个对象的两个不同变量。因此,当一个更改时,更改都会显示在两者上。哇,我不敢相信我只是花了这么多时间来解决这个问题,而答案是关于 javascript 如何工作的基本事实,这是我刚开始时学到的。
好的,新问题:
如何更改此代码以创建对象的副本,而不仅仅是指向原始对象?这不是我以前必须做的事情。
谢谢
JS:
var foos = new Array();
var bars = new Array();
function foo(aBars,bBars) {
var $this = this;
this.aBars = aBars;
this.bars = new Array();
bars.forEach(function(e,i) {
if ($this.aBars.lastIndexOf(e.barName) > -1) {
$this.bars.push(e);
if (bBars.lastIndexOf(e.barName) > -1) {
$this.bars[$this.bars.length-1].bBar = true;
} else {
$this.bars[$this.bars.length-1].bBar = false;
}
}
});
}
function bar(name) {
this.barName = name;
}
bars.push(new bar('l'));
bars.push(new bar('m'));
bars.push(new bar('n'));
bars.push(new bar('o'));
bars.push(new bar('p'));
foos.push(new foo(['l','m','n','o','p'],['n','p']));
foos.push(new foo(['l','n','o'],['n','o']));
console.log(foos);