2012-07-16 53 views
2

我真的無法字的問題隱約少,但我想你會明白......如何通過只是對它們的引用的變量將值分配給對象?

我開發一個JavaScript遊戲引擎,以及Scene對象,這是很多東西的容器,有一個方法,它應該改變其中的一個數組,特別是那個包含所有可以繪製的東西的方法。

該數組訪問是這樣的:

scene.internals.draw

的問題是,它是在該方法中引用了很多次,我認爲名/路徑可能發生變化。當然,我不希望每次我改變了磁盤陣列的路徑時每個引用更改爲它的方法,所以我這樣做:

var location = scene.internals.draw;

現在的實際方法代碼和算法可以留完好無損,如果場景中數組的名稱/路徑改變,我只需要改變那一行。

它在大多數情況下工作得很好。我可以.push(obj)它,等等,但在一個點,我需要「disect」的陣列,即劈成兩半,添加的東西,然後把它重新走到一起,就像這樣:

buff1 = location.slice(0, i); //First slice of the array. 
buff2 = location.slice(i, location.length); //Second slice of the array. 

//Add something in between those slices. 
buff1.push(ob); 
location = buff1.concat(buff2); //Problems here! 

這而location只是scene.internals.draw,因爲它直接改變了陣列。但現在,我將新值分配給當地location變量,而不是所需的scene.internals.draw

問題:如何使用=運算符爲「真實」對象分配值而不是包含對這些對象的引用的變量(如location)?

明顯的解決辦法是這樣,在方法的末尾:

scene.internals.draw = location.slice();

這是確定的,唯一的副作用是我會寫原來的名字兩次,和編輯它兩次,這不是一個很大的問題。但是,我可能會發現自己在其他情況下,我可能需要該功能,所以我仍然喜歡答案。

+1

您可以將位置重寫爲處理get和set的函數。 location()會得到,location(arr)會設置。不知道你是否會用這個號碼來工作 – 2012-07-16 20:52:10

+0

不確定你的意思,@CoryDanielson。 – corazza 2012-07-16 20:53:24

+0

我在想這樣的事情:http://jsfiddle.net/s2QQK/1/但Esailija的答案是非常好的。這個getter/setter是一種令人討厭的 – 2012-07-16 22:18:09

回答

2

在javascript中沒有引用的任務,所以你不能這樣做。你在做什麼通常被誤認爲是通過引用進行分配,但實際上它是一個參考值的副本,其含義如此。

你可能有更深層次的問題,因爲你正在這樣做,但我不想進入那個。

你可以這樣做:

location.splice(0, location.length); //Remove all items in the array 
location.push.apply(location, buff1.concat(buff2)); //Push the buffers into the array 
+0

非常感謝,我會用這個,但'.apply'方法需要一個數組作爲第二個參數嗎?你不應該使用'.call'嗎?另外,爲什麼要用這些函數首先改變上下文? – corazza 2012-07-16 21:11:14

+0

啊哈!我現在明白了! 'buff.conc ...'產生一個數組......現在一切都很清楚,謝謝。 – corazza 2012-07-16 21:12:19

+1

@禁止「.apply」的第一個參數是上下文,第二個參數是一個數組,它將作爲函數的參數。 'buff1.concat(buff2)'將會是'.push'的參數數組,它在'.location'上運行。 – Esailija 2012-07-16 21:13:13

2

要使用你的任期,有在Javascript中沒有「真實的」對象 - 只有對象和持有引用他們的變量。

當您分配到location時,您只需創建一個附加對對象的引用。系統不知道它是哪個「真實」對象,也沒有任何其他可能引用它的變量。

因此當你重新分配location你只是覆蓋特定的參考。對該對象的任何其他原始引用都將保持指向他們所在的位置。

+0

謝謝,這是非常豐富的。 – corazza 2012-07-16 21:07:18

相關問題