オブジェクトで Date、Function、Unknown、regExp、または Infinity を使用していない場合、非常に単純な行は JSON.parse(JSON.stringify(object)) です。
構(gòu)造化クローニングと呼ばれる新しい JS 標(biāo)準(zhǔn)があります。多くのブラウザで動(dòng)作します (「使用できますか 」を參照)。 リーリー
古い答えclone メソッドを
Object.prototype に追加する場合 (一部の回答が示唆しているように)、そのプロパティを明示的にスキップする必要があります。しかし、
Object.prototype にその他のメソッドが追加されている場合や、知らない他の中間プロトタイプがある場合はどうなるでしょうか?この場合、コピーすべきではないプロパティをコピーしているため、
hasOwnProperty メソッドを使用する必要があります。
prototype は関數(shù)の隠し屬性です。さらに、オブジェクトのプロトタイプはプロパティ
__proto__ を通じて參照されますが、これも非表示であり、ソース オブジェクトのプロパティを反復(fù)する for/in ループによってコピーされません。 __proto__ は Firefox の JavaScript インタプリタに固有であり、他のブラウザでは異なる可能性があると思いますが、アイデアは理解できますか。すべてが數(shù)えられるわけではありません。非表示のプロパティの名前がわかっている場合は、それをコピーできますが、それを自動(dòng)的に検出する方法はわかりません。
Object の場合は、
{} を使用して新しい汎用オブジェクトを作成するだけですが、ソース オブジェクトのプロトタイプが
Object の場合は、子孫コード>、その場合、
hasOwnProperty フィルターを使用してスキップされたプロトタイプ內(nèi)の他のメンバー、またはそもそも列挙可能ではなかったプロトタイプ內(nèi)の他のメンバーが失われます。解決策の 1 つは、ソース オブジェクトのコンストラクター プロパティを呼び出して初期コピー オブジェクトを取得し、その後プロパティをコピーすることですが、それでも列挙不可能なプロパティは取得できません。たとえば、
Date code> オブジェクトは、そのデータを非表示メンバーとして保存します。
リーリー
の日付文字列は、d2
より 5 秒後になります。ある Date
を別の Date
と同一にする方法は、setTime
メソッドを呼び出すことですが、これは Date
クラスに固有です。この問題に対する確実な普遍的な解決策はないと思いますが、間違っていることは幸いです。
一般的なディープ コピーを?qū)g裝する必要があったとき、私は最終的に妥協(xié)して、通常の Object
、Array
、Date代碼>、をコピーするだけでよいと考えました。 String代碼>、Number代碼>、または Boolean代碼>。最後の 3 つのタイプは不変なので、変更されることを気にせずに淺いコピーを?qū)g行できます。さらに、
Object
または Array
に含まれる要素も、このリストの 6 つの単純型の 1 つであると仮定します。これは次のようなコードで実行できます:
オブジェクトと配列內(nèi)のデータがツリー構(gòu)造を形成している限り、前述の 6 つの単純な型には上記の関數(shù)で十分です。つまり、オブジェクト內(nèi)の同じデータは 1 回だけ參照されます。例えば:### リーリー
これは JavaScript オブジェクトを処理できませんが、投げたものだけで動(dòng)作すると考えない限り、多くの目的には十分かもしれません。