javascript,保存对嵌套对象文字的引用

时间:2015-02-14 22:15:04

标签: javascript object-literal

假设我有以下对象:

name = {
    name_one : {
        name_one_A : {
            name_one_A_a : 'John',
            name_one_A_b : 'Kate'
        }
    }
};

我可以通过以下方式创建对“John”的引用:

current_name = name.name_one.name_one_A.name_one_A_a;

假设我多次引用“name.name_one.name_one_A”,有没有办法创建对此嵌套的引用?这不起作用,但是像:

A = name.name_one.name_one_A;
name = A.name_one_A_b;

'name'将等于'Kate'。我知道这不起作用,但我只是想知道是否有办法实现这个目标?

感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

很难确切地说出你所问的是什么导致了答案之间的混淆。

如果您多次引用name.name_one.name_one_A,则可以保存一次,然后再使用它:

var x = name.name_one.name_one_A;
x.name_one_A_a = 'Bill';
x.name_one_A_b = 'Sue';

这仅适用于name.name_one.name_one_A的值是对象(对象,数组或函数)。因此,当您将其保存到另一个变量时,您实际上并未保存对name.name_one.name_one_A的引用,而是获取该属性的值,该属性本身就是一个对象。然后,当您修改该对象时,由于name.name_one.name_one_A也指向同一个对象,您也会看到值也发生变化。


Javascript无法在对象上创建对特定属性的引用,因此您只能使用该引用然后更改该属性的值。

使用C / C ++术语,您无法在Javascript中创建指向对象属性的指针,这样您就可以仅使用该指针更改该属性中的值。

您必须传递主机对象和属性名称,然后可以更改该主机对象上的属性值。


或者,如果属性的值本身是一个对象(对象,数组或函数),那么您可以获取属性的值,然后更改它指向的对象。


所以,在你的数据结构中:

var name = {
    name_one : {
        name_one_A : {
            name_one_A_a : 'John',
            name_one_A_b : 'Kate'
        }
    }
};

没有办法直接引用:

name.name_one.name_one_A.name_one_A_a

可以让您稍后修改该属性的内容。相反,你已经做了类似这样的事情,你得到对包含对象的引用并使用它:

var obj = name.name_one.name_one_A;
var prop = "name_one_A_a";

// and then some time later:
obj[prop] = 'Bob';
// or
obj.name_one_A_a = 'Bob';

答案 1 :(得分:0)

Firefox Scratchpad遇到了一个名为" name"的变量的问题,但这有效:

var foo = {
'name_one' : {
    'name_one_A' : {
        'name_one_A_a' : 'John',
        'name_one_A_b' : 'Kate'
    }
}
};

var A = foo.name_one.name_one_A;
console.log(A.name_one_A_b);

//yields

凯特

  

更新

您可以获得能够更改属性值的引用:

var foo = {
    'name_one' : {
        'name_one_A' : {
            'name_one_A_a' : 'John',
            'name_one_A_b' : 'Kate'
        }
    }
};

var A = foo.name_one.name_one_A;
console.log(A.name_one_A_b);
A.name_one_A_b = "bob";
console.log(A.name_one_A_b);
console.log(JSON.stringify(foo));

收率:

"Kate"
"bob"
"{"name_one":{"name_one_A":{"name_one_A_a":"John","name_one_A_b":"bob"}}}"