通过Value NOT Reference返回Javascript对象的属性

时间:2009-08-25 21:39:36

标签: javascript arrays object function return-value

所以我有一个类foo,它有一个返回数组条的方法。我有另一个函数调用foo.getBar然后过滤数组。当我使用不同的过滤器时,我希望能够始终获得bar的原始内容,但是bing似乎只是创建对bar的引用,而不是单独的数组。我试过使用return this.bar.valueOf();在我的函数foo中,仍然无法正常工作。当我从bing中移除物品时,它们也会从栏中移除。有人请赐教我创建一个独特的数组而不是参考。

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 个答案:

答案 0 :(得分:5)

获取数组副本的最简单(据我所知,最快)方法是使用切片方法。没有任何参数,它默认为array.slice(0, array.length),因此它将复制整个数组。

你的getBar函数如下所示:

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

请注意,这是一个浅表副本,因此对数组中对象的任何更改都会影响原始对象(添加和删除项目不会影响它)。

答案 1 :(得分: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);

答案 2 :(得分: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);

答案 3 :(得分:0)

返回“克隆”将确保原始数组不受影响。请注意,这样的克隆会很浅。

function foo(x, y, z){

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

答案 4 :(得分:0)

不幸的是,javascript数组和对象总是通过引用传递。如果保证您的foo.bar数组是1维/不包含数组或对象,

然后你可以这样做:

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

这将执行foo.bar的1深拷贝,导致您的bing数组独立于foo.bar数组。

否则你必须滚动/找到深层复制方法,例如mootools中的$ A函数

var newArray = $A(oldArray)