2009-08-25 115 views
2

所以我有一個類foo有一個方法,它返回一個數組欄。我有另一個函數調用foo.getBar,然後過濾數組。當我使用不同的過濾器時,我希望能夠始終獲取條的原始內容,但bing似乎只是創建對條的引用,而不是單獨的數組。我試過使用return this.bar.valueOf();在我的函數foo中,仍然沒有工作。當我從冰上移除物品時,它們也會從酒吧中移除。有人請賜教,我創建一個獨特的數組而不是參考。返回一個Javascript對象的屬性的值不參考

function foo(x, y, z){ 

    this.bar = new Array(); 
    ... 
    this.bar = [ some , stuff , in , bar ]; 

    this.getBar = function getBar(){ 
     return this.bar;  
    } 
    ... 
} 

var FooObject = new foo(x,y,z); 

function baz(){ 

    var bing = FooObject.getBar(); 

    bing.splice(remove some pieces of the array); 
} 

回答

5

得到一份最簡單的(而據我所知,最快)的方法的數組是使用slice方法。沒有任何參數,它默認爲array.slice(0, array.length),所以它會複製整個數組。

你getBar功能應該是這樣的:

this.getBar = function getBar(){ 
    return this.bar.slice();   
} 

注意,這是一個淺拷貝,因此對數組中的對象的任何變化都會影響到原來的(添加和刪除項目不會影響它雖然)。

+0

我的數組包含對象,但自己不會被改變的對象,他們只需要再次添加的能力。 例如[對象福特,對象雪佛蘭,對象豐田,對象寶馬]我可能會運行巴茲只顯示美國汽車,所以我想能夠從陣列中刪除豐田和寶馬,然後運行一個方法在剩餘的對象渲染一些HTML,但如果過濾器被刪除,我希望能夠在所有數組項上再次運行渲染HTML方法。對象本身不會被更改,只是從數組副本中刪除。那麼這項工作會嗎? – Jesse 2009-08-26 14:39:36

+0

這似乎工作感謝大家的迅速反應!這是我第一次發佈Stack Overflow,它肯定不會是我的最後一次。 – Jesse 2009-08-26 14:47:34

+0

是的,這將工作。 – 2009-08-26 18:11:09

0

你將不得不做的事情就像下面這樣:將函數作爲參數傳遞並強制傳遞值;

function foo(x, y, z) { 
    this.bar = ['uno', 'dos', 'tres']; 
} 
foo.prototype.getBar = function() { 
    return this.bar; 
} 
... 
function getBar(fn) { 
    return fn(); 
} 
... 
var f = new foo(x, y, z); 
var bing = getBar(f.getBar); 
0

返回一個「克隆」將確保原始數組未被觸摸。請注意,這樣的克隆會很淺。

function foo(x, y, z){ 

    this.bar = [ some , stuff , in , bar ]; 
    ... 
    this.getBar = function getBar(){ 
     return this.bar.concat([]); 
    } 
    ... 
} 
0

不幸的是,javascript數組和對象總是被引用傳遞。如果你保證你的foo.bar數組是一維/不包含數組或對象,

然後,你可以這樣做:

var bing = FooObject.getBar().slice(0); 

哪會做的foo.bar 1 - 深拷貝,從而使您bing陣列獨立於foo.bar陣列。

否則,你將不得不滾動/找到一個深拷貝方法,如在mootools的$ A函數

var newArray = $A(oldArray) 
2

對於對象,使用克隆方法:

function cloneObject(source) { 
    for (i in source) { 
     if (typeof source[i] == 'source') { 
      this[i] = new cloneObject(source[i]); 
     } 
     else { 
      this[i] = source[i]; 
     } 
    } 
} 

var obj1= {bla:'blabla',foo:'foofoo',etc:'etc'}; 

var obj2= new cloneObject(obj1);