2012-08-27 52 views
8

我试图让变量“my_a”和letters.a指向同一个对象。是否有可能有2个变量指向同一个对象? (javascript)

//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?

谢谢。

+0

那么,你并不是真正在做你认为自己的东西。您将一个对象的内部变量指向另一个对象的值。做你想做的事情虽然在JavaScript中很愚蠢。请问你最终的目标是什么?也许我们可以找到更好的解决方案。 – SpYk3HH

+0

@ SpYk3HH我只需要参考当前的“字母”。只有两个“字母”。旧的或新的。他们需要在不同的时间进行切换。 letter1变旧,letter2变新。 – Wesley

+0

@韦斯利我用一种可能的方法更新了我的答案,具体取决于您的浏览器支持需求。 – Pointy

回答

5

的回答你的问题是“是”,但我觉得你的问题不能准确地描述你想要的东西做。你所希望的是letters.a可以引用变量“my_a”,这个意思是在C++中用&运算符可以做什么。这在JavaScript中是不可能的。

在语句:

my_a = new Object('c'); 

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

编辑 —实际上它发生,我认为你可以做一些像你通过定义一个“吸”为“信”中的“一”属性,它返回的“当前值寻找什么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.

+0

这里有个好结果 – Austin

+0

另一件你可以做的事情就是把字母变成一个数组,然后用一个新字符写一个简单的函数给FiFo数组。像函数fifoArray(myArray,newValue){myArray.pop(); myArray.unshift(NEWVALUE); }'那么myArray [0]将永远是最新的,myArray [1]将永远是最后一个 – SpYk3HH

3

您可以指向两个变量相同的对象或值在JavaScript像这样:

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

而且,也没有必要使用对象的构造,大括号作为构造和节省打字。也就是说,这样的:

var a = new Object(); 

等同于:

var a = {} 
+0

这样做有任何改进或好处吗? –

2

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

因此,my_a和letters.a都包含同一对象的地址。那么你改变my_a来包含一个新对象的地址。但是letters.a仍然包含第一个对象的地址!

因此,在脚本结尾处,您的my_a指向对象'c',letters.a指向对象'a'。

获取字母的唯一方法。和my_a指向你叫“C”的对象,是要重新做

letters.a = my_a 

,设置letters.a包含新的“C”对象的地址。

顺便说一下,保存更基本类型(如int,char)的变量实际上包含变量本身的值,而不是指向实际数据的指针。

0

是的,这是可能的。

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

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

0

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

0

为什么不使用这样的结构:

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

它更清洁恕我直言。

相关问题