0

関数から、元のオブジェクトに影響を与えずに(つまり、副作用がない)、引数として渡されたオブジェクトの変更バージョンを返したいと思います。だから本質的に私は価値を渡したいのです。オブジェクトの(ディープ)コピーされたバージョンを変更して返すことにより、これを実行しようとしました。ただし、クローンオブジェクトに加えた変更が、元のオブジェクトに影響を与えていることがわかりました。

newObjectでmodifyMyDataを呼び出すと、oldObjectのデータに影響するため、以下のコードスニペットはこれを示しています。

var clone = function(oldObject) {
    return jQuery.extend(true, {}, oldObject);
}

var objf = function() {
    var data = {list:[1],dic:{a:'3'}};
    this.modifyMyData = function() {
        data.list.push(3);
        data.dic['e'] = 10;
    }
    this.getData = function() {
        return data;
    }
}

var old = new objf;
var newo = clone(old);
newo.modifyMyData();

どうすればこれを回避できますか?

4

1 に答える 1

1

これを試してみてください。あなたが望むように機能すると思います。変数データをオブジェクトに添付する必要があります。あなたが行っていた方法は、それをクロージャー付きの変数に変えたため、コピーされませんでした。

var clone = function(oldObject) {
    return jQuery.extend(true, {}, oldObject);
}

var objf = function() {
    this.data = {list:[1],dic:{a:'3'}};

    this.modifyMyData = function() {

        this.data.list.push(3);
        this.data.dic['e'] = 10;
    }
    this.getData = function() {
        return this.data;
    }
}

var old = new objf();
var newo = clone(old);
newo.modifyMyData();
于 2012-04-13T01:16:11.323 に答える