为什么对象构造函数中的函数会改变以前由该构造函数创建的所有对象?

时间:2013-05-22 21:16:25

标签: javascript object constructor

我在对象构造函数中有一个函数,它正在改变由该构造函数创建的所有对象。我不知道为什么。有人可以看看我的代码并告诉我我错过了什么吗?

快速描述正在发生的事情:

警告!阅读代码可能比尝试理解我的描述更容易

我创建了两个新数组。第一个名为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如何运作的基本事实时,我在第一次开始时就学会了。

好的,新问题:

如何更改此代码以创建对象的副本而不是仅仅指向原件?这不是我以前必须做的事情。


由于

jsfiddle

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);

1 个答案:

答案 0 :(得分:0)

实现这一目标的唯一方法是替换此行

$this.bars.push(e); 

在你的'foo'构造函数中有这个:

$this.bars.push(new bar(e.barName));

只能通过复制其属性来克隆javascript中的对象。