我只是做了一个小测试,看看Javascript如何响应在父对象中更改子对象的值。我想查看父级是否引用了该子级并且是否与新值保持同步,或者它是否只保留其实例化的子级的初始状态。
我有小模块 coords.js
var NS = NS || {};
NS.Coords = function(){
var __parentArray = {};
var __childArray = {};
addToParent = function(){
__childArray['value'] = "Initial";
__parentArray['child'] = __childArray;
},
showParent = function(){
console.log("Parent: ",__parentArray);
console.log("Child within parent: ",__parentArray['child']);
},
changeChild = function(){
__childArray['value'] = "Changed";
},
showChild = function(){
console.log("Child: ",__childArray]);
};
return {
addToParent: addToParent,
showParent: showParent,
changeChild: changeChild,
showChild: showChild
};
}();
在 main.js
中var NS = NS || {};
// @codekit-prepend "Coords.js"
console.log("=============================");
console.log("Startpoint point");
console.log("=============================");
var coords = NS.Coords;
coords.addToParent();
coords.showChild();
coords.showParent();
console.log("=============================");
console.log("Changed child value");
console.log("=============================");
coords.changeChild();
coords.showChild();
coords.showParent();
如果你运行它,你会在控制台中看到,当直接显示时,孩子会显示预期的"初始"然后"改变"值。
然而,父母总是会显示"已更改"它引用的子对象的值。甚至在调用changeChild()之前。不知道为什么。即使没有改变价值,它也表明它已被改变。我错过了一些超级简单的东西,还是我误解了这里发生了什么?
答案 0 :(得分:1)
第一个问题是你可能正在使用 GOOGLE CHROME ,我的意思是这不是问题,但不要忘记,如果你更改了一个属性,控制台会更新它 AUTOMAGICALLY 也是。 (不太神奇吗?)
如果您将此console.log("Child within parent: ",__parentArray['child']);
更改为console.log("Child within parent: ",__parentArray['child']['value']);
,那么您可以看到您的脚本正常运行。
答案 1 :(得分:1)
您的代码中存在一些语法错误,但一旦修复了这些错误,您所描述的行为就不会发生。一些浏览器'控制台提供对象的内联引用,在对象更改时更新。答案是观察值字符串而不是整个对象:
console.log("Child within parent: ",__parentArray['child'].value);
console.log("Child: ",__childArray.value);
但是为了澄清你最初试图找出的问题,是的,如果你改变了另一个对象引用的对象,那么无论你如何观察它,这个改变都会被重新定位,因为引用恰恰是那个 - 从一个对象到另一个对象的链接。
作为旁注,您的变量名称包含" array"在它们中,但那些不是你正在使用的数组,而是对象。数组通常使用方括号[1, 2, 3, 4]
创建,并且只包含值,而不是键值对。