我试图让变量“my_a”和letters.a指向同一个对象。
//i want letters.a to reference (point to) my_a, not be a copy...
//expected output should be: letters.a = c
//made variables into Objects.. but didn't help.
var my_a = new Object('a');
var my_b = new Object('b');
var letters = {'a': my_a, 'b': my_b};
$('#output').append('my_a = ' + my_a + '<br>');
$('#output').append('leters.a = ' + letters.a + '<br>');
my_a = new Object('c');
$('#output').append('my_a = ' + my_a + '<br>');
$('#output').append('letters.a = <span style="color:red">' + letters.a + '</span>');
看到这个小提琴:
但正如您可以通过输出看到的,这不起作用。
有什么想法吗?这可以用javascript吗?
谢谢。
答案 0 :(得分:5)
你的问题的答案是“是”,但我认为你的问题没有准确描述你想要做的事情。你想要的是letters.a
引用变量“my_a”,意思是在C ++中用&
运算符可以做什么。这在JavaScript中是不可能的。
声明:
my_a = new Object('c');
你给“my_a”一个新的,不同的价值。因此,letters.a
仍然指的是它所做的相同的事情,而“my_a”已经改变了。没有办法让变量或对象属性“跟踪”另一个(在JavaScript中)。
编辑 - 实际上我发现你可以通过为“字母”的“a”属性定义“getter”来做你喜欢的事情,返回“my_a”的当前值。它需要您正在使用的JavaScript引擎中的功能,但它看起来像:
var letters = {};
Object.defineProperty(letters, "a", {
get: function() { return my_a; },
set: function(v) { my_a = v; }
});
不幸的是,IE9之前的IE不支持。 Here's the updated jsfiddle.
答案 1 :(得分:4)
您可以将2个变量指向javascript中的相同对象或值,如下所示:
var a = b = {};
// both a and b now reference the same object
此外,不需要使用对象构造函数,花括号用作构造函数并保存键入。即,这个:
var a = new Object();
相当于:
var a = {}
答案 2 :(得分:2)
您对指针的概念感到困惑。将对象存储在变量中时,实际上将该对象的地址存储在变量中。
因此,my_a和letters.a都包含同一对象的地址。然后你改变my_a以包含一个新对象的地址。但letters.a仍然包含第一个对象的地址!
因此,在您的脚本结束时,您的my_a指向对象&c 39,并且字母指向对象&#39; a&#39;。
让letters.a和my_a指向您调用的对象&#39; c&#39;的唯一方法是
letters.a = my_a
再次,设置letters.a以包含新的&#39; c&#39;的地址。对象
顺便说一下,持有更基本类型的变量(如ints,char)实际上包含变量本身的值,而不是指向实际数据的指针。
答案 3 :(得分:0)
是的,这是可能的。
你是在正确的方向,但犯了一个小错误。
初始化var letters = {'a': my_a, 'b': my_b};
时,您插入了my_a当时指向的对象。
之后更改my_a
并未更改letters
,因为它已包含指向Object('a')
的直接指针。
答案 4 :(得分:0)
是的,它非常有可能并且是默认值。但是,在您的代码中,当您要修改值时,您正在修改引用(my_a = new Object('c');)。如果你使用数组而不是字符串,这将更清楚地说明,例如my_1 = [23]; my_1 [0] = 8;
答案 5 :(得分:0)
为什么你没有使用这样的结构:
var letters = {'a': (new Object('a')), 'b': (new Object('b'))};
这是更清洁的imho。