0

underscore.jsライブラリにはcloneメソッドがあります。

var newObject = _.clone(oldObject);

コメントの1つから、それは浅いクローンだと読みました。オブジェクトのクローンを作成して、それをさまざまな関数に渡したい。

内にあるnewObjectを変更するとfunction A()、次の結果が得られます...

{
    'Des': 'Some Des'
    'Des1': 4,
    'Des2': {
        "ChildDes": 0,

    },
},

しかし、クローンオブジェクトであるnewObjectを別のオブジェクトに渡すと、function B()アラート値がとして取得され[Object,Object]ます。なんで?このような値を印刷することはできません。

function B(newObject){
   alert(newObject.Des2);
}
4

2 に答える 2

4

「浅いコピー」とは、すべてのメンバーをコピーするだけのコピーです。メンバーの1つがオブジェクトへの参照である場合、コピーされた参照を変更すると、元の参照に影響します。「ディープコピー」はオブジェクトもコピーするため、ディープコピーされた要素を変更しても元のオブジェクトには影響しません。オブジェクトメンバーがオブジェクト自体の参照を持つ可能性があるため、ディープコピーを実現するのが難しい場合があります。

さまざまなコピースタイルで少し遊んで、何が起こるかを自分で確かめてください。参照:オブジェクトのclone()とはどういう意味ですか?

于 2012-06-03T09:31:14.917 に答える
0

「浅いコピー」と「深いコピー」という用語は一貫して使用されていないため、IMHOは避ける必要があります。代わりに、クローン作成操作を3つのカテゴリに分類することをお勧めします。

  1. さまざまなオブジェクト(たとえば、 `SuperDuperList`)を保持することを目的としたパブリッククローン作成メソッドの動作は、元のタイプと同じインスタンスを保持するが、そこから切り離された、元のタイプの新しいインスタンスを作成することです。元のオブジェクトまたは複製されたオブジェクトに対して行われることは、他のオブジェクトが保持するもののIDに影響を与えるべきではありません。`SuperDuperList`には`T[] `型のプライベートフィールドがいくつかあるかもしれませんが、`SuperDuperList`の目的は`T`の配列を保持することではなく、インスタンスを保持することであることに注意してください`T`の。したがって、 `SuperDuperCollection`の適切なクローン作成方法では、可変配列を、元の配列と同じ` T`インスタンスを保持しているが、それらから切り離されている新しい配列に置き換える必要があります。このタイプのコピーを「浅いコピー」と呼ぶ人もいますが、以下の#2「壊れたコピー」のセマンティクスにその用語を使用する人もいます。それを「ディープコピー」と呼ぶ人もいますが、私を含めて、その用語を使用法#3に制限する人もいます。私は「セマンティックレベルのコピー」という用語を好みます。
  2. 一部の壊れたクローン作成方法では、元のオブジェクトとクローン作成されたオブジェクトの両方が、元のオブジェクトの観点からは変更可能な共有オブジェクトへの参照を保持したままになります。`SuperDuperList`の観点から、タイプ` T`の格納場所は、変更可能なオブジェクト `T`への参照を保持せず、`T`の不変IDを保持することに注意してください。一方、`SuperDuperList`に`T`の配列への参照を保持するフィールドがあり、その配列が変更される場合は、元のオブジェクトと複製されたオブジェクトの両方が同じ参照を保持できるようにする複製メソッド配列が壊れます。
  3. 一部の複製方法では、複製されるオブジェクトが保持するオブジェクトが特定の特別な基準を満たし、それら自体が複製できるようにする必要があります(通常、ネストされたすべてのオブジェクトのすべてのプロパティは不変であるか、複製方法を提供する必要があります)。場合によっては、そのようなオブジェクトのコレクションは、オブジェクトが何であるか、またはそれらのクローン作成メソッドが実際に何をするかを正確に知らない可能性があります。コレクションの複製操作のセマンティクスが、そこに格納されているオブジェクトの理解よりも深くなる場合、そのようなコレクションは深く複製可能です。

派生オブジェクトのクローン作成メソッドの通常のパターンは、親のクローンを作成することから始め、次に、クローン作成されるオブジェクトが保持することになっているものを保持し、保持に依存できない外部オブジェクトへの参照を保持するフィールドをクローンすることです。それらの同じことを永遠に。すべての派生クラスがそのパターンに従う場合、適切なセマンティックレベルのクローン作成が実現されます。

于 2012-06-22T17:47:33.137 に答える