Dalam JavaScript, semua penugasan antara variabel objek dilewatkan melalui alamat. Beberapa siswa mungkin bertanya objek objek mana. Mungkin lebih baik memberi contoh:
Salinan kode adalah sebagai berikut:
typeof (true) // "boolean"
Tipeof (1) // "Nomor"
typeof ("1") // "string"
typeof ({}) // "objek"
typeof ([]) // "objek"
typeof (null) // "objek"
typeof (function () {}) // "fungsi"
Jadi pada kenyataannya, objek yang perlu kita tangani dengan penyalinan mendalam adalah objek objek, dan objek non-objek hanya ditetapkan secara langsung dan normal. Ide saya untuk menerapkan replikasi JS yang mendalam adalah:
Iterasi melalui semua sifat objek ini,
Jika properti adalah "objek", pemrosesan khusus diperlukan.
Jika objek ini khusus dan merupakan array, maka buat array baru dan salin elemen -elemen dalam array.
Jika objek ini objek adalah objek non-array, maka panggil saja metode salinan dalam secara rekursif di atasnya.
Jika bukan "objek", cukup salin secara normal.
Inilah implementasi saya:
Salinan kode adalah sebagai berikut:
Object.prototype.deepcopy = function () {
var obj, i;
obj = {};
untuk (attr in this) {
if (this.hasownproperty (attr)) {
if (typeof (ini [attr]) === "objek") {
if (ini [attr] === null) {
obj [attr] = null;
}
lain if (object.prototype.toString.call (ini [attr]) === '[array objek]') {
obj [attr] = [];
untuk (i = 0; i <ini [attr] .length; i ++) {
obj [attr] .push (ini [attr] [i] .deepcopy ());
}
} kalau tidak {
obj [attr] = ini [attr] .deepcopy ();
}
} kalau tidak {
obj [attr] = ini [attr];
}
}
}
kembalikan obj;
};
Jika browser mendukung ecmascript 5, Anda dapat menggunakannya untuk menyalin semua fitur properti objek secara mendalam
Salinan kode adalah sebagai berikut:
Object.defineproperty (obj, attr, object.getOwnPropertyDescriptor (this, attr));
Untuk mengganti
Salinan kode adalah sebagai berikut:
obj [attr] = ini [attr];
Keuntungan mengimplementasikan metode ini secara langsung pada objek.prototype adalah bahwa semua objek mewarisi metode ini. Kerugiannya adalah bahwa beberapa perpustakaan juga akan menulis ulang objek objek, jadi kadang -kadang terjadi konflik. Ini perlu diperhatikan. Metode penggunaan spesifik adalah sebagai berikut:
Salinan kode adalah sebagai berikut:
Object.prototype.deepcopy = function () {...}
var a = {x: 1};
var b = a;
var c = a.deepcopy ();
kapak = 2;
bx = 3;
Console.log (AX); // 3
console.log (bx); // 3
Console.log (CX); // 1
Di atas adalah penjelasan tentang replikasi mendalam. Namun, karena kami berbicara tentang replikasi mendalam hari ini, kami ingin memiliki replikasi yang dangkal secara bersamaan. Mari kita ringkas secara singkat persamaan dan perbedaan di antara mereka.
Salinan Dangkal (Kloning Bayangan): Hanya salin tipe dasar objek dan jenis objek yang masih termasuk dalam referensi asli.
DEEP COPY (kloning dalam): Tidak menyalin kelas dasar objek, tetapi juga menyalin objek dalam objek asli. Dengan kata lain, itu benar -benar dihasilkan oleh objek baru.