Javascript 为什么对象构造函数中的函数会改变该构造函数以前创建的所有对象?
我在一个对象构造函数中有一个函数,它改变了由该构造函数创建的所有对象。我不知道为什么。有人能看一下我的代码,告诉我我遗漏了什么吗 快速描述正在发生的事情: 警告通读代码可能比理解我的描述更容易 我创建了两个新阵列。第一个称为Javascript 为什么对象构造函数中的函数会改变该构造函数以前创建的所有对象?,javascript,object,constructor,Javascript,Object,Constructor,我在一个对象构造函数中有一个函数,它改变了由该构造函数创建的所有对象。我不知道为什么。有人能看一下我的代码,告诉我我遗漏了什么吗 快速描述正在发生的事情: 警告通读代码可能比理解我的描述更容易 我创建了两个新阵列。第一个称为foos,它是一个foo对象数组,每个对象包含一个bar对象数组。第二个称为bar,它是可添加到foos.foo.bar数组中的所有bar对象的数组 使用foo对象构造函数创建新的foo对象时,会给它两个参数(aBars,bBars)aBars是要包含在foo对象中的所有ba
foos
,它是一个foo
对象数组,每个对象包含一个bar
对象数组。第二个称为bar
,它是可添加到foos.foo.bar
数组中的所有bar
对象的数组
使用foo
对象构造函数创建新的foo
对象时,会给它两个参数(aBars,bBars
)aBars
是要包含在foo
对象中的所有bar
对象的数组bBars
是所有包含的bar
对象的数组,这些对象在某种程度上被认为是“特殊的”。在构造函数中,有一个函数贯穿bar
数组中的每个对象,如果它的名称值与aBars
参数中字符串的名称值匹配,则它将被添加到foo.bar
数组中。如果它的名称值与bBar
参数中的字符串匹配,则它的属性bBar
设置为true,否则设置为false
我遇到的问题是,在第二个foo
对象构造函数中,当一个bar对象的bBar设置为true或false时,它还会在所有其他foo.bar
对象中更改该对象中的值
我意识到这可能很难理解。很抱歉,今天已经结束了
找到了我自己的答案! 我才意识到问题是什么
foos[0]。条[4]
和foos[1]。条[3]
不是单独的对象,它们只是指向同一对象的两个不同变量。因此,当其中一个发生变化时,这两个变化都会出现。哇,我简直不敢相信我花了这么多时间在这上面,而答案是关于javascript如何工作的基本事实,这是我刚开始学习的时候学到的
好,新问题:
如何更改此代码以创建对象的副本,而不是仅指向原始对象?这不是我以前必须做的事情
谢谢 JS:
实现这一目标的唯一方法是更换这条线路
$this.bars.push(e);
在您的“foo”构造函数中,使用以下命令:
$this.bars.push(new bar(e.barName));
在javascript中克隆对象只能通过复制对象的属性来实现。这段代码有很多地方出错。。。但是有两件事:不要使用
新数组
,使用[]
。始终将结构大写。公约事项。无论何时在构造函数中定义函数,请思考原型
,最重要的是:阅读此
以及forEach
回调的调用上下文为什么我不应该使用新数组
?我读过,并且被教导过,当定义一个空数组时,新数组
更好。是的,我通常大写结构,这更像是一个打字错误,因为我试图在JSFIDLE中快速地重新创建问题。我怎么没有“思考原型”?你在哪里学的新数组更好?数组构造函数,它严重超载(newarray(10)
vsnewarray('10')
),并且在编写bar.foreach时,您没有考虑原型(函数
,它与this.bar
不同,它为您创建的每个实例构造一个foreach回调。最好将其变成一个原型方法…感谢您的澄清。我将开始使用[]
bar.foreach()正在为全局变量bars
中的每个对象运行函数。bars将指向一个空数组。bars的要点是。foreach
回调用作过滤器,仅将所需对象从全局变量添加到此新数组。我是否缺少您的要点?我明白您关于使用pro的要点不过,对于键入方法,我肯定会有所忽略。谢谢你的帮助。我对这方面还比较陌生,无论在哪里我都能得到指导。好吧,拥有构造函数(或任何函数)的行为依赖一个全局变量并不是一个好主意。特别是如果这个全局变量与属性同名。如果我看到这段代码在工作,我会假设有人犯了错误,因为他使用了全局变量而对他大喊大叫。我建议你研究一下,这样你就可以将条
数组“绑定”到构造函数。
$this.bars.push(new bar(e.barName));