Sobes.tech
Middle

Kaip padaryti objekto savybę nekeičiama?

sobes.tech AI

Atsakymas iš AI

Padaryti objekto savybę nekeičiama galima keliais būdais:

  1. 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"
    
  2. 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.

  3. Naudojant const kintamuosius, kurie laiko objektą:

    Raktažodis const padaro 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.