Saya baru saja mendengar tentang metode JavaScript freeze
dan seal
, yang dapat digunakan untuk membuat Objek apa pun tidak berubah.
Berikut adalah contoh singkat cara menggunakannya:
var o1 = {}, o2 = {};
Object.freeze(o2);
o1["a"] = "worked";
o2["a"] = "worked";
alert(o1["a"]); //prints "worked"
alert(o2["a"]); //prints "undefined"
Apa perbedaan antara freeze
dan seal
? Bisakah mereka meningkatkan kinerja?
javascript
ecmascript-5
maja
sumber
sumber
Object.preventExtensions
tambahanObject.seal
danObject.freeze
.Object.preventExtensions
hanya mencegah item baru agar tidak ditambahkan ke objek. Anda dapat menghapus, mengonfigurasi, dan mengubah nilai properti pada objek yang ekstensibilitasnya dimatikanObject.preventExtensions
.Jawaban:
Object.seal
delete
akan mengembalikan falsewritable
atribut mereka , danvalue
atribut mereka jikawriteable
itu benar).TypeError
ketika mencoba mengubah nilai objek yang disegel itu sendiri (paling umum dalam mode ketat )Object.freeze
Object.seal
dilakukan, ditambah:Tidak ada yang memengaruhi objek 'mendalam' / cucu. Misalnya, jika
obj
dibekukan,obj.el
tidak dapat dipindahkan, tetapi nilaiobj.el
dapat dimodifikasi, misalnyaobj.el.id
dapat diubah.Kinerja:
Menyegel atau membekukan suatu objek dapat mempengaruhi kecepatan enumerasinya, tergantung pada browser:
Pengujian: Benda bersegel , Benda beku .
sumber
seal
juga membuat properti yang ada tidak dapat dikonfigurasi, lihat jsfiddle.net/btipling/6m743whn Nomor 2, Anda masih dapat mengedit, yaitu mengubah nilai properti yang ada pada objek yang disegel.onClick
atauonlick
dan bertanya-tanya mengapa itu tidak berhasil. Jika JavaScript membuat kesalahan, maka itu satu hal yang salah. Kedua, ini memungkinkan Anda untuk menerapkan properti konstan pada objek yang mencegah perubahan. Ini sangat berguna pada objek methjods.Saya menulis proyek uji yang membandingkan 3 metode ini:
Object.freeze()
Object.seal()
Object.preventExtensions()
Tes unit saya mencakup kasus CRUD:
Hasil:
sumber
DEBUGMODE
variabel dan aturtrue
. Lalu, lakukanif (DEBUGMODE) { ... }
. Dalam...
, taruh fungsionalitas Anda untuk memastikan semua objek DOM selalu tersegel. Kemudian, ketika Anda siap untuk mendistribusikan skrip halaman web Anda, ubahDEBUGMODE
menjadifalse
, jalankan skrip Anda melalui kompilator penutupan, dan distribusikan. Sesederhana itu.element.onlick=something
dan menjadi frustrasi karena tidak berhasil, tetapi secara teknis tidak ada kesalahan.Anda selalu dapat mencari ini di MDN. Pendeknya:
sumber
Object.seal()
juga sepertinya membekukan properti prototipe: \Object.freeze()
membuat objek beku, yang berarti mengambil objek yang ada dan pada dasarnya memanggilnyaObject.seal()
, tetapi juga menandai semua properti "pengakses data" sebagaiwritable:false
, sehingga nilainya tidak dapat diubah. - Kyle Simpson, Anda Tidak Tahu JS - Ini & Objek Prototipesumber
Saya melihat perbedaan antara Freeze dan Seal di ECMAScript 5 dan membuat skrip untuk menjelaskan perbedaan. Frozen menciptakan objek yang tidak berubah termasuk data dan struktur. Seal mencegah perubahan pada antarmuka yang diberi nama - tidak ada tambahan, hapus - tetapi Anda dapat mengubah objek dan mendefinisikan ulang arti antarmuka-nya.
sumber
Saya tahu saya mungkin sedikit terlambat tetapi
false
. di mana seperti dalam atribut Tertulis yang dapat disetel diatur ketrue
dan atribut lainnya salah.sumber
Object.getOwnPropertyDescriptor(Object.freeze({ prop: 1 }), 'prop').enumerable
===true
.Anda sekarang dapat memaksa properti objek tunggal untuk dibekukan alih-alih membekukan seluruh objek. Anda dapat mencapai ini dengan
Object.defineProperty
denganwritable: false
sebagai parameter.Dalam contoh ini,
obj.first
sekarang nilainya dikunci ke 99.sumber
Saya telah membuat tabel sederhana untuk membandingkan fungsi-fungsi di bawah ini dan menjelaskan perbedaan antara fungsi-fungsi ini.
sumber