2017-01-04 10 views
16

ES6を使用してJavascriptクラスインスタンスをクローンする方法を教えてください。javascript ES6クラスインスタンスを複製する方法

jqueryまたは$ extendに基づくソリューションに興味はありません。

問題が非常に複雑であることを示唆するオブジェクトクローンについてはかなり古い議論がありますが、ES6では非常に単純な解決策が提示されます。私はそれを下に置き、人々が満足できると思っているかどうかを見ていきます。

編集:私の質問は重複していることが示唆されています。私はその答えを見ましたが、それは7歳であり、ES6より前のjを使用すると非常に複雑な回答が含まれています。私は、ES6を可能にする私の質問には劇的に単純な解決策があることを示唆しています。

+2

Stack Overflowに関する古い質問に対して新しい回答がある場合は、元の質問にその回答を追加してください。新しい質問を作成するだけではありません。 –

+1

ES6クラスのインスタンスが「通常の」オブジェクトとは異なるため、Tomが/直面していた問題があります。 – CreasolDev

+2

また、ES6クラスのインスタンス上で実行しようとすると、 "duplicate"の可能性があると答えた最初のコードが実際にクラッシュします – CreasolDev

答えて

2
const clone = Object.assign({}, instanceOfBlah); 
Object.setPrototypeOf(clone, Blah.prototype); 

Object.assignの特性に注意してください:シャローコピーを行い、クラスメソッドをコピーしません。

コピーを深くコピーしたい場合は、lodash clone functionsがあります。

+2

'Object.create'は指定されたプロトタイプを持つ新しいオブジェクトを作成するので、' const clone = Object.assign(Object.create(instanceOfBlah)、instanceOfBlah) 'だけにしましょう。また、クラスメソッドも同様にコピーされます。 – barbatus

+0

@barbatusそれは、間違ったプロトタイプ、 'Blah.prototype!= instanceOfBlah'を使っています。 'Object.getPrototypeOf(instanceOfBlah)'を使うべきです – Bergi

+0

@Bergiいいえ、ES6クラスのインスタンスは必ずしもプロトタイプを持っているとは限りません。 https://codepen.io/techniq/pen/qdZeZmもインスタンスと一緒に動作することを確認してください。 – barbatus

16
let clone = Object.assign(Object.create(Object.getPrototypeOf(orig)), orig) 

私は多くを試しましたが、これは私のために働いていました。

また、they sayがコードを大きく遅くするので、プロトタイプを設定しないようにします。

これは1ライナーです!

+0

これは、実際に列挙可能なプロパティではないため、静的メソッドをコピーしません。 –

+0

@ Mr.Lavalampとどうやって静的メソッドをコピーできますか? – flori

関連する問題