0

我在对象构造函数中有一个函数,它改变了该构造函数创建的所有对象。我不确定为什么。有人可以看看我的代码并告诉我我缺少什么吗?

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

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

我创建了两个新数组。第一个称为foos,它将是一个对象数组,foo每个对象都包含一个bar对象数组。第二个被称为它是可添加到bars数组中的所有对象的数组。barfoos.foo.bars

foo当使用对象构造函数创建一个新对象时foo,它会被赋予两个参数(aBars,bBars)。是要包含在对象aBars中的所有对象的数组。是所有包含对象的数组,这些对象以某种方式被认为是“特殊的”。在构造函数中,有一个函数遍历数组中的每个对象,如果它的名称值与参数中的字符串匹配,则将其添加到数组中。如果它的名称值与参数中的字符串匹配,则将其属性设置为 true,否则设置为 false。barfoobBarsbarbarsaBarsfoo.barsbBarsbBar

我遇到的问题是,在第二个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);
4

1 回答 1

0

实现这一目标的唯一方法是替换这条线

$this.bars.push(e); 

在你的 'foo'-constructor 中使用这个:

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

在 javascript 中克隆对象只能通过复制它们的属性来实现。

于 2013-05-22T21:36:07.930 回答