2011-06-05 98 views
0

我正在讀書閱讀器。我有一個可變的currentPostition,顧名思義,它總是知道用戶在書中的哪個位置。我正在嘗試創建用戶位置的歷史記錄,以便我可以添加一個後退按鈕,如Web瀏覽器。所以在設置我:JS/Javascript使用.push或.unshift來跟蹤變量的歷史

currentPostition; //this is a json object with book,chapter,page stored in it. 
history = [];   //array of json objects 

再後來,當用戶導航(也有少數不同類型的導航):

history.push(currentPostition); //save in history before updating currpos 

//put new values in currentPosition 
currentPostition.book = foo; 
currentPostition.chapter = foo; 
currentPostition.page = foo; 

到目前爲止好權?那麼問題就是這樣。我的歷史數組按照人們的預期長度增長。但是,歷史數組中的每個條目將與數組中放置的最後一個對象相同。 IE:

for (x=0;v<history.lenght;x++){ 
    document.write(history[x].book+","+history[x].chapter+","+history[x].page+"<br />"); 
} 

將導致一些輸出像

3rdBookPosition,3rdChapterPosition,3rdPagePosition 3rdBookPosition,3rdChapterPosition,3rdPagePosition 3rdBookPosition,3rdChapterPosition,3rdPagePosition

所以,我m stumped因爲我期望輸出如:

1stBookPosition,1stChapterPosition,1stPagePosition 2ndBookPosition,2ndChapterPosition,2ndPagePosition 3rdBookPosition,3rdChapterPosition,3rdPagePosition

我在做什麼錯?僅供參考,我已經試過unshifthistory[history.length]以及同樣的結果。

由於提前, 乙腦

回答

0

的問題是,你把你的currentPosition對象的同一個實例在歷史陣列。 這樣做會導致多指針指向相同的currentPosition實例

爲了避免這個問題,你需要或者通過使用關鍵字new如果你有一個構造函數或通過簡單地複製對象到另一個喜歡用jQuery做$.extend({},currentPosition)使用 currentPosition實例。

希望得到這個幫助。

編輯: 您可以創建自己的擴展功能,這樣的事情:

function extends(destObject,srcObject){ 
    for(var i in srcObject){ 
    destObject[i] = srcObject[i]; 
    } 
} 

這是一個非常簡單的版本,你可以發現稍微複雜一點的版本,將遞歸克隆你的對象,但我想我可以你的問題就足夠了,所以它會是:

var oldPos = extends({},currentPosition); 
history.push(oldPos); 
+0

我沒有訪問jquery的權限。如果沒有jquery,我還可以將對象複製到另一個對象中? – user785178 2011-06-06 00:08:19

+0

您可以聲明自己的擴展函數,請參閱編輯之前的響應 – malko 2011-06-06 08:19:11

0

大多數在JS中的所有通過引用傳遞。所以,你只需要添加currentPostition的數組引用。您需要在使用currentPostition之前另外分配新的空對象:

currentPostition = {};