プロトタイプの拡張を行うことはお勧めしません。コード/コンポーネントでテストを行うときに問題が発生します。単体テストフレームワークは、プロトタイプの拡張を自動的に想定しません。したがって、これは良い習慣ではありません。プロトタイプ拡張の説明はここにありますネイティブオブジェクトを拡張するのはなぜ悪い習慣なのですか?
JavaScriptでオブジェクトのクローンを作成するには、単純で簡単な方法はありません。これが「ShallowCopy」を使用した最初のインスタンスです。
1->浅いクローン:
class Employee {
constructor(first, last, street) {
this.firstName = first;
this.lastName = last;
this.address = { street: street };
}
logFullName() {
console.log(this.firstName + ' ' + this.lastName);
}
}
let original = new Employee('Cassio', 'Seffrin', 'Street A, 23');
let clone = Object.assign({},original);
let cloneWithPrototype Object.create(Object.getPrototypeOf(original)), original)
let clone2 = { ...original };
clone.firstName = 'John';
clone.address.street = 'Street B, 99';
結果:
original.logFullName():
結果:Cassio Seffrin
clone.logFullName():
結果:ジョン・セフリン
original.address.street;
結果: 'ストリートB、99' //元のサブオブジェクトが変更されたことに注意してください
注意:インスタンスに独自のプロパティとしてクロージャがある場合、このメソッドはそれをラップしません。(クロージャの詳細を読む)さらに、サブオブジェクト「アドレス」は複製されません。
clone.logFullName()
動作しないでしょう。
cloneWithPrototype.logFullName()
クローンはそのプロトタイプもコピーするため、機能します。
Object.assignを使用して配列のクローンを作成するには:
let cloneArr = array.map((a) => Object.assign({}, a));
ECMAScriptスプレッドsintaxを使用したクローン配列:
let cloneArrSpread = array.map((a) => ({ ...a }));
2->ディープクローン:
完全に新しいオブジェクト参照をアーカイブするには、JSON.stringify()を使用して元のオブジェクトを文字列として解析し、解析後にJSON.parse()に戻します。
let deepClone = JSON.parse(JSON.stringify(original));
ディープクローンを使用すると、アドレスへの参照が保持されます。ただし、deepCloneプロトタイプは失われるため、deepClone.logFullName()は機能しません。
3->サードパーティライブラリ:
別のオプションは、loadashやアンダースコアなどのサードパーティライブラリを使用することです。新しいオブジェクトを作成し、各値を元のオブジェクトから新しいオブジェクトにコピーして、その参照をメモリに保持します。
アンダースコア:cloneUnderscore = _(original).clone();
Loadashクローン:var cloneLodash = _.cloneDeep(original);
lodashまたはアンダースコアの欠点は、プロジェクトにいくつかの追加ライブラリを含める必要があることでした。ただし、これらは優れたオプションであり、高性能の結果も生成します。