Saya mengalami masalah di mana saya harus menyimpan nilai awal objek momen tetapi saya mengalami masalah mencegah variabel saya berubah seiring dengan objek aslinya.
Sayangnya Object.freeze () tidak berfungsi, karena moment.js mengembalikan kesalahan "Invalid date" ketika saya mencoba memformatnya.
javascript
object
immutability
momentjs
mutability
Shengbo 1618
sumber
sumber
Jawaban:
Ada plugin Moment.js di NPM yang disebut momen beku - Anda dapat menggunakannya
moment().freeze()
sebagai penggantiObject.freeze(moment())
.Jika tidak, vanilla Moment.js memiliki
clone
metode yang akan membantu Anda menghindari masalah mutabilitas, jadi Anda dapat melakukan sesuatu seperti ini:MEMPERBARUI:
Sudah dua tahun sejak saya menulis jawaban ini. Saat ini, perpustakaan lain untuk bekerja dengan tanggal telah muncul dan mendapatkan banyak daya tarik: https://date-fns.org/
Library ini tidak dapat diubah secara default dan mengikuti arsitektur modular fungsional, yang berarti lebih cocok untuk pengocokan pohon dan bundling sisi klien. Jika Anda sedang mengerjakan proyek yang menggunakan Webpack secara ekstensif di sisi klien, dan menemukan bahwa Moment.js memberi Anda masalah dengan build Anda, atau bahkan jika mutabilitas Moment.js membuat Anda sangat pusing, maka Anda harus
date-fns
dicoba.sumber
moment
variabel yang disimpan tanpa memutasinya: cukup gunakan clone () seperti ini:zz = moment(); zz.clone().add(3, 'h').toISOString();
date-fns
untuk sementara waktu sekarang tetapi sejak itu harus melompat ke kode warisan menggunakan Momen dan anak laki-laki, apakah posting ini menyelamatkan saya dari melompat keluar jendela.dayjs
juga merupakan alternatif yang baik karena memiliki API yang mirip dengan Moment.js dengan sifat yang tidak berubah. (Mulai Maret 2019, tidak ada dukungan zona waktu tetapi ini adalah perpustakaan yang cukup baru dan saya dapat mengamati bahwa pekerjaan sedang berlangsung.)Ini pertanyaan lama dan permintaan maaf untuk promosi diri yang tidak tahu malu karena ini bukan niat saya, hanya berharap itu akan membantu seseorang.
Selain apa yang dikatakan razorbeard (
.clone()
dll) saya membuat modul NPM yang melampirkan metode yang tidak dapat diubah ke apa pun yang dilengkapi dengan Moment.js di luar kotak. Tujuannya bukan untuk merusak kode yang ada sehingga modul menambahkan metode baru denganImmu
menambahkan namanya.Setiap instance yang dikembalikan oleh pabrik saat akan didekorasi dengan metode yang tidak dapat diubah misalnya
moment().startOf()
akan memiliki yang sesuaistartOfImmu()
,add()
akan memiliki,addImmu()
dll. Masing-masing mengembalikan momen baru daripada memodifikasi yang sudah ada. Untuk menggunakannya, cukup lewatimoment
pabrikmomentImmutableMethods
untuk mendapatkan akses ke metode baru yang tidak dapat diubah. Contoh:Ada di NPM di https://www.npmjs.com/package/moment-immutable-methods
sumber