2017-07-03 3 views
0
アクセルRauschmayer Emanauten、ES6で非常に人気のある本、言うことで

Exploring JSObject.assignテキストでJSを探索する際の正誤情報?あなたはクローンはオリジナルと同じプロトタイプを持つようにしたい場合は

、あなたはObject.getPrototypeOf()とObject.createを(使用することができます):しかし真実ではないように思わ

function clone(orig) { 
    const origProto = Object.getPrototypeOf(orig); 
    return Object.assign(Object.create(origProto), orig); 
} 

var a = {a:1}; 
var o1 = Object.create(a); 
Object.getPrototypeOf(o1); //shows {a:1} of course 
var o2 = Object.assign(o1); 
Object.getPrototypeOf(o2); // also shows {a:1} 

は、なぜ彼らは同じ」と言うん元の "クローンのプロトタイプ? Object.assignは既に元のプロトタイプと同じプロトタイプを持っていて、clone()のプロトタイプからすべての列挙可能なメソッドをコピーしてプロトタイプへのリンクを完全に失っているようです。

+2

...彼らは試作品を除いて同じであることを確認しますメソッドは、ターゲットを変更します。最初に、source_1のすべての列挙可能な(継承されていない)プロパティをその中にコピーし、次にsource_2のすべてのプロパティをコピーします。最後に、ターゲットを返します。 'Object.assign'はそれに渡された最初の引数を返します。つまり、アプリケーションは実際にオブジェクトをクローンしません。 –

+0

あなたのコードは 'clone'がまったく何をしないのかをしません。プロトタイプで 'Object.create'を使用しておらず、クローンを作成するオブジェクトで' Object.getPrototypeOf'を使用していないので、2つのパラメータで 'Object.assign'を使用しません。これらはすべて重要な部分です。 – Bergi

答えて

3
var o2 = Object.assign(o1); 

に等しい:Object.assignは最初の引数を返すよう

var o2 = o1; 

。次の引数は、最初の1にコピーされるので、あなたが行うことがあります。

var o2=Object.assign({},o1); 

そして、あなたはこの "*あなたがするリンクセクションの先頭からの

+0

そうですね、それは新しいオブジェクトを返さないということです。それは議論を変えている。カッコいい。私はJSが突然変異して何が戻ってくるのか混乱しました。 –

+1

@EvanCarroll:そうです。なぜ彼が 'function clone(orig){return Object.assign({}、orig)}を使用しているのですか? } 'クローン実装ではなく、' function clone(orig){return Object.assign(orig); } '。 –

関連する問題