Immutabilitas adalah prinsip inti dalam pemrograman fungsional, dan memiliki banyak hal untuk ditawarkan pada program berorientasi objek juga. Objek mutable adalah objek yang keadaannya dapat dimodifikasi setelah dibuat. Objek immutable adalah objek yang keadaannya tidak dapat dimodifikasi setelah dibuat.
Apa contoh objek immutable di JavaScript?
Di JavaScript, beberapa tipe bawaan (angka, string) adalah immutable, tetapi objek kustom umumnya mutable.
Beberapa objek JavaScript immutable bawaan adalah Math
, Date
.
Berikut adalah beberapa cara untuk menambahkan/mensimulasikan immutabilitas pada objek JavaScript biasa.
Properti Konstanta Objek
Dengan menggabungkan writable: false
dan configurable: false
, Anda pada dasarnya dapat membuat konstanta (tidak dapat diubah, didefinisikan ulang, atau dihapus) sebagai properti objek, seperti:
let myObject = {};
Object.defineProperty(myObject, 'number', {
value: 42,
writable: false,
configurable: false,
});
console.log(myObject.number); // 42
myObject.number = 43;
console.log(myObject.number); // 42
Mencegah Ekstensi
Jika Anda ingin mencegah objek memiliki properti baru yang ditambahkan padanya, tetapi membiarkan properti objek lainnya tidak berubah, panggil Object.preventExtensions(...)
:
var myObject = {
a: 2,
};
Object.preventExtensions(myObject);
myObject.b = 3;
myObject.b; // undefined
Dalam mode non-strict, pembuatan b
gagal secara diam-diam. Dalam mode strict, ia membuang TypeError
.
Segel (Seal)
Object.seal()
membuat objek "tersegel", yang berarti ia mengambil objek yang ada dan pada dasarnya memanggil Object.preventExtensions()
padanya, tetapi juga menandai semua properti yang ada sebagai configurable: false
.
Jadi, Anda tidak hanya tidak dapat menambahkan properti lagi, tetapi Anda juga tidak dapat mengkonfigurasi ulang atau menghapus properti yang ada (meskipun Anda masih dapat memodifikasi nilainya).
Bekukan (Freeze)
Object.freeze()
membuat objek beku, yang berarti ia mengambil objek yang ada dan pada dasarnya memanggil Object.seal()
padanya, tetapi juga menandai semua properti "data accessor" sebagai writable:false, sehingga nilainya tidak dapat diubah.
Pendekatan ini adalah tingkat imutabilitas tertinggi yang dapat Anda capai untuk objek itu sendiri, karena mencegah perubahan apa pun pada objek atau pada properti langsungnya (meskipun, seperti yang disebutkan di atas, isi objek lain yang direferensikan tidak terpengaruh).
var immutable = Object.freeze({});
Membekukan objek tidak memungkinkan properti baru ditambahkan ke objek dan mencegah penghapusan atau pengubahan properti yang ada. Object.freeze()
mempertahankan enumerability, configurability, writability dan prototipe objek. Ini mengembalikan objek yang dilewatkan dan tidak membuat salinan beku.
Apa pro dan kontra dari imutabilitas?
Kelebihan
- Deteksi perubahan lebih mudah - Kesetaraan objek dapat ditentukan secara performa dan mudah melalui kesetaraan referensial. Ini berguna untuk membandingkan perbedaan objek di React dan Redux.
- Program dengan objek immutable lebih mudah dipikirkan, karena Anda tidak perlu khawatir tentang bagaimana objek dapat berkembang seiring waktu.
- Salinan defensif tidak lagi diperlukan ketika objek immutable dikembalikan dari atau dilewatkan ke fungsi, karena tidak ada kemungkinan objek immutable akan dimodifikasi olehnya.
- Berbagi mudah melalui referensi - Satu salinan objek sama baiknya dengan yang lain, sehingga Anda dapat menyimpan objek dalam cache atau menggunakan kembali objek yang sama beberapa kali.
- Thread-safe - Objek immutable dapat digunakan dengan aman antara thread dalam lingkungan multi-threaded karena tidak ada risiko mereka dimodifikasi dalam thread lain yang berjalan secara bersamaan.
- Menggunakan pustaka seperti ImmutableJS, objek dimodifikasi menggunakan pembagian struktural dan lebih sedikit memori yang dibutuhkan untuk memiliki banyak objek dengan struktur yang serupa.
Kekurangan
- Implementasi naif dari struktur data immutable dan operasinya dapat mengakibatkan kinerja yang sangat buruk karena objek baru dibuat setiap saat. Disarankan untuk menggunakan pustaka untuk struktur data immutable yang efisien dan operasi yang memanfaatkan pembagian struktural.
- Alokasi (dan dealokasi) banyak objek kecil daripada memodifikasi yang sudah ada dapat menyebabkan dampak kinerja. Kompleksitas alokator atau pengumpul sampah biasanya tergantung pada jumlah objek di heap.
- Struktur data siklik seperti grafik sulit dibangun. Jika Anda memiliki dua objek yang tidak dapat dimodifikasi setelah inisialisasi, bagaimana Anda bisa membuatnya saling menunjuk?