2012-08-27 53 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'))}; 

它更清潔恕我直言。

相關問題