Object.freeze dan Object.seal dalam JavaScript
Apabila bekerja dengan objek dalam JavaScript, mengawal kebolehubahannya adalah penting untuk mengelakkan perubahan yang tidak diingini. Dua kaedah yang disediakan oleh JavaScript untuk tujuan ini ialah Object.freeze() dan Object.seal(). Memahami perbezaan dan kes penggunaan mereka adalah kunci untuk menulis kod yang mantap.
1. Object.freeze()
Kaedah Object.freeze() menjadikan objek tidak berubah. Ini bermakna:
- Tiada sifat baharu boleh ditambah.
- Sifat sedia ada tidak boleh diubah suai, dialih keluar atau dikonfigurasikan semula.
- Objek secara berkesan "beku" dan tidak boleh ditukar dengan apa cara sekalipun.
Sintaks:
Object.freeze(obj);
Salin selepas log masuk
Salin selepas log masuk
Contoh:
const obj = { name: "Alice", age: 25 };
Object.freeze(obj);
obj.age = 30; // Does nothing (strict mode: throws an error)
obj.gender = "female"; // Does nothing (strict mode: throws an error)
delete obj.name; // Does nothing (strict mode: throws an error)
console.log(obj); // { name: "Alice", age: 25 }
Salin selepas log masuk
Salin selepas log masuk
Kes Penggunaan:
- Untuk memastikan objek kekal malar sepanjang program anda, seperti tetapan konfigurasi.
Menyemak sama ada Objek Dibekukan:
Gunakan Object.isFrozen() untuk menentukan sama ada objek dibekukan:
console.log(Object.isFrozen(obj)); // true
Salin selepas log masuk
Salin selepas log masuk
2. Object.seal()
Kaedah Object.seal() mengehadkan pengubahsuaian pada objek tetapi kurang ketat daripada Object.freeze(). Ia membenarkan:
-
Pengubahsuaian sifat sedia ada (nilai boleh berubah).
-
Pencegahan menambah atau mengalih keluar sifat.
Sintaks:
Object.seal(obj);
Salin selepas log masuk
Contoh:
const obj = { name: "Bob", age: 30 };
Object.seal(obj);
obj.age = 35; // Allowed: Existing properties can be modified
obj.gender = "male"; // Does nothing (strict mode: throws an error)
delete obj.name; // Does nothing (strict mode: throws an error)
console.log(obj); // { name: "Bob", age: 35 }
Salin selepas log masuk
Kes Penggunaan:
- Apabila anda ingin melindungi struktur objek (menghalang penambahan/pemadaman) tetapi masih membenarkan perubahan pada nilai harta benda.
Menyemak sama ada Objek Dimeterai:
Gunakan Object.isSealed() untuk menentukan sama ada objek dimeterai:
Object.freeze(obj);
Salin selepas log masuk
Salin selepas log masuk
3. Perbezaan Utama Antara Object.freeze() dan Object.seal()
Ciri |
Object.freeze() |
Object.seal() |
Tambah sifat baharu |
Feature |
Object.freeze() |
Object.seal() |
Add new properties |
Not allowed |
Not allowed |
Remove existing properties |
Not allowed |
Not allowed |
Modify existing properties |
Not allowed |
Allowed |
Reconfigure property descriptors |
Not allowed |
Not allowed |
Use case |
Immutable objects (constants) |
Restrict structure but allow value changes |
Tidak dibenarkan |
Tidak dibenarkan
|
Alih keluar sifat sedia ada |
Tidak dibenarkan |
Tidak dibenarkan
|
Ubah suai sifat sedia ada |
Tidak dibenarkan |
Dibenarkan
|
Konfigurasikan semula deskriptor sifat |
Tidak dibenarkan |
Tidak dibenarkanconst obj = { name: "Alice", age: 25 };
Object.freeze(obj);
obj.age = 30; // Does nothing (strict mode: throws an error)
obj.gender = "female"; // Does nothing (strict mode: throws an error)
delete obj.name; // Does nothing (strict mode: throws an error)
console.log(obj); // { name: "Alice", age: 25 }
Salin selepas log masuk Salin selepas log masuk
|
Kes penggunaan |
Objek tidak boleh ubah (pemalar) |
Hadkan struktur tetapi benarkan perubahan nilai |
4. Objek Bersarang Beku dan Tertutupconsole.log(Object.isFrozen(obj)); // true
Salin selepas log masuk
Salin selepas log masuk
Kedua-dua Object.freeze() dan Object.seal() adalah cetek, bermakna ia tidak menjejaskan objek bersarang. Untuk membekukan atau mengelak objek secara mendalam, anda perlu menggunakan kaedah secara rekursif pada setiap objek bersarang.
- Contoh (Kesan Cetek):
-
Fungsi Pembantu Deep Freeze:
-
5. Perangkap dan Petua Biasa
Tingkah Laku Mod Tidak ketat
: Dalam mod tidak ketat, perubahan pada objek beku atau tertutup gagal secara senyap. Sentiasa gunakan mod ketat ("gunakan ketat";) untuk penyahpepijatan yang lebih jelas.
Cegah Kekeliruan dengan Kebolehubahan Objek: Dokumen dengan jelas bila dan sebab objek dibekukan atau dimeterai untuk mengelakkan salah tafsir dalam persekitaran pasukan.
Kedap Sebelum Membekukan
: Jika anda mahukan kedua-dua struktur terhad dan kebolehubahan, tutup objek dahulu, kemudian bekukannya.
Kesimpulan
Kedua-dua Object.freeze() dan Object.seal() ialah alatan yang berharga untuk mengurus kebolehubah objek dalam JavaScript. Walaupun Object.freeze() memastikan kebolehubah sepenuhnya, Object.seal() menawarkan fleksibiliti dengan membenarkan perubahan pada nilai harta sedia ada. Memilih kaedah yang betul bergantung pada tahap kawalan yang anda perlukan ke atas objek anda.
Hai, saya Abhay Singh Kathayat!
Saya seorang pembangun tindanan penuh dengan kepakaran dalam kedua-dua teknologi hadapan dan belakang. Saya bekerja dengan pelbagai bahasa pengaturcaraan dan rangka kerja untuk membina aplikasi yang cekap, berskala dan mesra pengguna.
Jangan ragu untuk menghubungi saya melalui e-mel perniagaan saya: kaashshorts28@gmail.com.
Atas ialah kandungan terperinci Menguasai Object.freeze() dan Object.seal() dalam JavaScript: Mengawal Kebolehubahan Objek. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!