2009-08-25 113 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);