Tidak disarankan untuk membuat ekstensi Prototipe, Ini akan mengakibatkan masalah saat Anda akan melakukan tes pada kode / komponen Anda. Kerangka pengujian unit tidak akan secara otomatis mengasumsikan ekstensi prototipe Anda. Jadi ini bukanlah praktik yang baik. Ada lebih banyak penjelasan tentang ekstensi prototipe di sini. Mengapa memperluas objek asli merupakan praktik yang buruk?
Untuk mengkloning objek di JavaScript tidak ada cara yang sederhana atau mudah. Berikut ini contoh pertama yang menggunakan "Shallow Copy":
1 -> Klon dangkal:
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';
Hasil:
original.logFullName ():
hasil: Cassio Seffrin
clone.logFullName ():
hasil: John Seffrin
original.address.street;
hasil: 'Street B, 99' // perhatikan bahwa sub objek asli telah diubah
Perhatian: Jika instance memiliki closure sebagai propertinya sendiri, metode ini tidak akan membungkusnya. ( baca lebih lanjut tentang closures ) Dan plus, sub object "address" tidak akan di kloning.
clone.logFullName ()
tidak akan bekerja.
cloneWithPrototype.logFullName ()
akan berfungsi, karena klon juga akan menyalin Prototipe-nya.
Untuk mengkloning array dengan Object.assign:
let cloneArr = array.map((a) => Object.assign({}, a));
Klon array menggunakan sintaks penyebaran ECMAScript:
let cloneArrSpread = array.map((a) => ({ ...a }));
2 -> Klon Dalam:
Untuk mengarsipkan referensi objek yang benar-benar baru, kita dapat menggunakan JSON.stringify () untuk mengurai objek asli sebagai string dan setelah mengurai kembali ke JSON.parse ().
let deepClone = JSON.parse(JSON.stringify(original));
Dengan deep clone, referensi ke alamat akan disimpan. Namun Prototipe deepClone akan dihilangkan, oleh karena itu deepClone.logFullName () tidak akan berfungsi.
3 -> perpustakaan pihak ke-3:
Pilihan lain akan menggunakan pustaka pihak ke-3 seperti loadash atau garis bawah. Mereka akan membuat objek baru dan menyalin setiap nilai dari aslinya ke objek baru dengan menyimpan referensinya di memori.
Garis bawah: biarkan cloneUnderscore = _ (asli) .clone ();
Loadash clone: var cloneLodash = _.cloneDeep (asli);
Kelemahan dari lodash atau garis bawah adalah kebutuhan untuk memasukkan beberapa perpustakaan tambahan dalam proyek Anda. Bagaimanapun mereka adalah pilihan yang baik dan juga menghasilkan hasil kinerja tinggi.