8

我试图让变量“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>');
​

看到这个小提琴:

http://jsfiddle.net/jCsUq/1/

但正如您从输出中看到的那样,这是行不通的。

有任何想法吗?这可以用javascript吗?

谢谢你。

4

6 回答 6

5

您的问题的答案是“是”,但我认为您的问题并不能准确地描述您正在尝试做的事情。你想要的letters.a是引用变量“my_a”,从某种意义上说,在 C++ 中可以使用&操作符做什么。这在 JavaScript 中是不可能的。

在声明中:

my_a = new Object('c');

你给“my_a”一个新的、不同的价值。因此,letters.a仍然指的是它所做的相同的事情,而“my_a”已经改变了。没有办法让变量或对象属性“跟踪”另一个(在 JavaScript 中)。

编辑——实际上我想到你可以通过为“letters”的“a”属性定义一个“getter”来做你正在寻找的事情,它返回“my_a”的当前值。它需要您正在使用的 JavaScript 引擎中的该功能,但它看起来像:

var letters = {};
Object.defineProperty(letters, "a", {
  get: function() { return my_a; },
  set: function(v) { my_a = v; }
});

不幸的是,IE9 之前的 IE 不支持该功能。这是更新的jsfiddle。

于 2012-08-27T14:22:10.200 回答
4

您可以将 2 个变量指向 javascript 中的相同对象或值,如下所示:

var a = b = {};
// both a and b now reference the same object

此外,不需要使用对象构造函数,花括号用作构造函数并节省输入。即,这个:

var a = new Object();

相当于:

var a = {}
于 2012-08-27T14:22:01.637 回答
1

您对指针的概念感到困惑。当您将对象存储在变量中时,您实际上将该对象的地址存储在变量中。

所以,my_a 和 letters.a 都包含同一个对象的地址。然后更改 my_a 以包含新对象的地址。但是 letters.a 仍然包含第一个对象的地址!

所以在脚本的最后,my_a 指向对象'c',而 letters.a 指向对象'a'。

让 letters.a 和 my_a 指向您称为“c”的对象的唯一方法是

letters.a = my_a

再次设置 letters.a 以包含新的“c”对象的地址。

顺便说一句,持有更基本类型(如 ints、char)的变量实际上包含变量本身的值,而不是指向实际数据的指针。

于 2012-08-27T14:22:57.750 回答
0

是的,这是可能的。

你的方向是对的,但犯了一个小错误。初始化时var letters = {'a': my_a, 'b': my_b};,您插入了 my_a在那一刻指向的对象。

之后更改my_a并没有改变letters,因为它已经包含一个直接指向Object('a').

于 2012-08-27T14:24:34.603 回答
0

是的,这是非常可能的,并且是默认设置。但是,在您的代码中,当您打算修改值时,您正在修改引用 (my_a = new Object('c');)。如果您使用数组而不是字符串,这将更清楚地说明,例如 my_1 = [23]; 我的_1[0] = 8;

于 2012-08-27T14:25:25.800 回答
0

为什么你不使用这样的构造:

var letters = {'a': (new Object('a')), 'b': (new Object('b'))};

恕我直言,它更清洁。

于 2012-08-27T14:26:35.053 回答