我在对象构造函数中有一个函数,它正在改变由该构造函数创建的所有对象。我不知道为什么。有人可以看看我的代码并告诉我我错过了什么吗?
快速描述正在发生的事情:
我创建了两个新数组。第一个名为foos
,它将是一个foo
个对象的数组,每个对象包含一个bar
个对象的数组。第二个称为bars
,它是可以添加到bar
数组的所有foos.foo.bars
个对象的数组。
使用foo
对象构造函数创建新的foo
对象时,会给出两个参数(aBars,bBars
)。 aBars
是要包含在bar
对象中的所有foo
个对象的数组。 bBars
是包含所有bar
个对象的数组,这些对象在某种程度上被视为“特殊”。在构造函数中,有一个函数贯穿bars
数组中的每个对象,如果它的名称值与aBars
参数中的字符串匹配,则它将被添加到foo.bars
数组中。如果它的名称值与bBars
参数中的字符串匹配,则将其属性bBar
设置为true,否则将其设置为false。
我遇到的问题是,在第二个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);
答案 0 :(得分:0)
实现这一目标的唯一方法是替换此行
$this.bars.push(e);
在你的'foo'构造函数中有这个:
$this.bars.push(new bar(e.barName));
只能通过复制其属性来克隆javascript中的对象。