0

多くのJavascriptを実行し、Javascriptオブジェクトをよりよく理解しようとしています。先ほど前の質問をしましたが、これは違います。オブジェクト間に存在する参照関係を切断できますか?

例えば:

var objA={};
objA.my_name='Joe';
var objB=objA;
objB.my_name="jake"; // objA.my_name="jake"
objB.something="this is something";
objA.last_name="Jackson";
console.log(objA.something);  // "this si something" can add to parent object at runtime
console.log(objB.last_name);  // "Jackson" can add to child object at runtime
// now I'd like to cut off objB from objA such that:
objB.cell_phone='323-213-2323';
console.log(objA.cell_phone); // '323-213-2323' but would like undefined; would like this behavior

事前にt​​hx

4

1 に答える 1

3

オブジェクトに参照動作を停止するように指示することはできません。それがJavaScriptの仕組みです。

オブジェクトをコピーして、元のオブジェクトと同じプロパティを持つまったく新しいオブジェクトを作成できますが、参照動作を持たない完全に別のオブジェクトを作成できます。

浅いコピーは、オブジェクトのプロパティを反復処理し、それぞれを新しいオブジェクトに割り当てるだけで作成できます。

function shallowCopy(src, dest) {
    for (var prop in src) {
        if (src.hasOwnProperty(prop)) {
            dest[prop] = src[prop];
        }
    }
} 

配列の浅いコピーは、次のように実行できます。

var arr = [1,2,3];
var copyArr = [].slice.call(arr, 0);

オブジェクトまたは配列自体であるプロパティもコピーされるディープ コピーでは、それらがオブジェクトまたは配列であるかどうかを本質的に確認し、それらとその内容を再帰的にコピーする必要があるため、より多くの作業が必要になります。ここに示すように、浅いコピーははるかに簡単で、データの内容がわかっている場合は、多くの場合十分です。


高度なバージョンのコピー (ディープ コピーを含む) を見たい場合は、ここ.extend()で jQuery の関数のコードを参照できます。そのリンクをたどって、 を検索します。fn.extend

于 2013-01-21T18:31:12.073 に答える