Kaip padaryti objekto savybę nekeičiama?
sobes.tech AI
Atsakymas iš AI
Padaryti objekto savybę nekeičiama galima keliais būdais:
-
Naudojant
Object.defineProperty():Šis metodas leidžia apibrėžti arba keisti objekto savybes su detalesne kontrole. Norint sukurti nekeičiama savybę, reikia nustatyti savybės aprašytoją su
writable: false:const obj = {}; Object.defineProperty(obj, 'myProperty', { value: 'Ne keičiama reikšmė', writable: false, // Padaro savybę nekeičiama enumerable: true, // Savybė bus matoma per iteraciją configurable: true // Savybę galima ištrinti arba keisti jos aprašytoją }); // Bandymas pakeisti reikšmę bus ignoruojamas negriežtame režime // ir sukels klaidą TypeError griežtame režime obj.myProperty = 'Nauja reikšmė'; console.log(obj.myProperty); // Išves "Ne keičiama reikšmė"Jei nustatysite
configurable: false, savybė nebus galima ištrinti ar keisti jos aprašytojo:const obj2 = {}; Object.defineProperty(obj2, 'myProperty', { value: 'Ne keičiama ir neleidžiama ištrinti', writable: false, enumerable: true, configurable: false // Padaro savybės aprašytoją nekeičiama }); // Bandymas pakeisti reikšmę obj2.myProperty = 'Nauja reikšmė'; console.log(obj2.myProperty); // Išves "Ne keičiama ir neleidžiama ištrinti" // Bandymas ištrinti savybę delete obj2.myProperty; console.log(obj2.myProperty); // Išves "Ne keičiama ir neleidžiama ištrinti" -
Naudojant
Object.freeze():Šis metodas padaro objektą "užšaldytą". Tai reiškia, kad negalima pridėti naujų savybių, ištrinti esamų, keisti esamų savybių reikšmes (įskaitant jų sąrašą ir konfigūraciją), taip pat keisti objekto prototipą:
const obj = { myProperty: 'Ne keičiama reikšmė' }; Object.freeze(obj); // Bandymas pakeisti reikšmę obj.myProperty = 'Nauja reikšmė'; console.log(obj.myProperty); // Išves "Ne keičiama reikšmė" // Bandymas pridėti naują savybę obj.newProperty = 'Nauja'; console.log(obj.newProperty); // Išves `undefined` // Bandymas ištrinti savybę delete obj.myProperty; console.log(obj.myProperty); // Išves "Ne keičiama reikšmė"Svarbu pažymėti, kad
Object.freeze()yra paviršutiniškas. Jei savybė yra kitas objektas, jis nebus užšaldytas. -
Naudojant
constkintamuosius, kurie laiko objektą:Raktažodis
constpadaro nuorodą į objektą nekeičiama, bet pats objektas gali būti keičiamas:const obj = { myProperty: 'Pradinis reikšmė' }; // Galima keisti savybės reikšmę obj.myProperty = 'Nauja reikšmė'; console.log(obj.myProperty); // Išves "Nauja reikšmė" // Negalima pakeisti nuorodos // obj = { kitaProperty: 'Kita' }; // Sukels TypeError
Lyginamoji lentelė metodų:
| Metodas | Kas daro nekeičiama? | Neaikščio lygis |
|---|---|---|
Object.defineProperty() |
Viena savybė | Apibrėžiama deskriptoriumi |
Object.freeze() |
Visa objektas | Paviršutiniškai |
const |
Nuoroda į objektą | Kintamasis |
Pasirinkimas priklauso nuo to, kiek detaliai norite kontroliuoti nekeičiama. Vienai savybei tinka Object.defineProperty(), visam objektui - Object.freeze(). Nuorodos keitimo išvengimui naudojamas const.