2017-11-21 18 views
0

私は間違ったことをする必要があります。新しいVARとしてES6更新されたクローンプロパティがオリジナルに影響しないようにする方法は?

    名前のボブなど
  1. インスタンス化のPersonクラスのボブ
  2. クローンボブがアリス
  3. 名前の名前の変更アリスアリスボブ&アリス

  • ログイン名ボブの名前は「ボブ」のままになると思うが、ボブを更新していないのに「アリス」に更新されている。事前に

    class Person { 
     
        constructor(attr) { 
     
        this.attr = attr; 
     
        } 
     
    
     
        talk() { 
     
        console.log('My name is ' + this.attr.name); 
     
        } 
     
    } 
     
    
     
    function clone(obj) { 
     
        return Object.assign(Object.create(Object.getPrototypeOf(obj)), obj); 
     
    } 
     
    
     
    var Bob = new Person({ 
     
        name: 'Bob' 
     
    }); 
     
    
     
    var Alice = clone(Bob); 
     
    Alice.attr.name = 'Alice'; 
     
    
     
    Alice.talk(); 
     
    Bob.talk();

    感謝。

  • +0

    オブジェクトをクローニングする方法は? – Intervalia

    +0

    あなたは 'Bob 'だけをクローンしました。あなたは 'attr'オブジェクトを複製しませんでした。ネストされたオブジェクトではなく、オブジェクト自体に値を格納してください! – Bergi

    答えて

    2

    Object.assignは浅いコピーを実行し、そうBobAliceattr参照の独自のコピーを持っているであろうが、それらは同じネストされたオブジェクトを参照します。 attr.nameはまだ共有文字列です。

    あなたが深い(ER)のコピーを実行するか、あるいはattrプロパティを再割り当てする必要があります。

    Alice.attr = { name: 'Alice' }; 
    
    +0

    この洞察は完璧です。ありがとうございました! – blindmikey

    +0

    クローン化は、親のような参照や循環参照、関数、副作用のあるゲッターなどを持つユーザー定義オブジェクトの場合はあいまいです。たとえば、[私が深いクローンの質問に与えたこの回答](https://stackoverflow.com/questions/4459928/how-to-deep-clone-in-javascript/40294058#40294058)を参照してください。 – trincot

    1

    クローニングのための最も簡単な解決策は次のとおりです。

    var cloned = JSON.parse(JSON.stringify(objectToClone)); 
    

    しかし、キャッチが、この中にありますこれは、オブジェクトの属性値が関数である場合には失敗します。クローニングのより深い洞察のための

    var a = {name: 'a', exec: function() {return true;}}; 
    var b = JSON.parse(JSON.stringify(a)); 
    console.log(b); // {name: 'a'} 
    

    、あなたはこの記事を参照することができます:deep cloning

    関連する問題