Javascript对象子引用

时间:2014-05-16 15:24:57

标签: javascript object

我只是做了一个小测试,看看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()之前。不知道为什么。即使没有改变价值,它也表明它已被改变。我错过了一些超级简单的东西,还是我误解了这里发生了什么?

2 个答案:

答案 0 :(得分:1)

第一个问题是你可能正在使用 GOOGLE CHROME ,我的意思是这不是问题,但不要忘记,如果你更改了一个属性,控制台会更新它 AUTOMAGICALLY 也是。 (不太神奇吗?)

如果您将此console.log("Child within parent: ",__parentArray['child']);更改为console.log("Child within parent: ",__parentArray['child']['value']);,那么您可以看到您的脚本正常运行。

这是小提琴:http://jsfiddle.net/M4Cd8/

答案 1 :(得分:1)

您的代码中存在一些语法错误,但一旦修复了这些错误,您所描述的行为就不会发生。一些浏览器'控制台提供对象的内联引用,在对象更改时更新。答案是观察值字符串而不是整个对象:

console.log("Child within parent: ",__parentArray['child'].value);
console.log("Child: ",__childArray.value);

http://jsfiddle.net/pNtJJ/

但是为了澄清你最初试图找出的问题,是的,如果你改变了另一个对象引用的对象,那么无论你如何观察它,这个改变都会被重新定位,因为引用恰恰是那个 - 从一个对象到另一个对象的链接。

作为旁注,您的变量名称包含" array"在它们中,但那些不是你正在使用的数组,而是对象。数组通常使用方括号[1, 2, 3, 4]创建,并且只包含值,而不是键值对。