Sobes.tech
Middle

Kuidas teha objekti omadus muutumatuks?

sobes.tech AI

Vastus AI-lt

Objekti omaduste muutmatuks muutmiseks on mitu viisi:

  1. Kasutades Object.defineProperty():

    See meetod võimaldab määratleda või muuta objekti omadusi suurema kontrolliga. Muutumatuks omaduseks tuleb määrata omaduse kirjeldaja writable: false:

    const obj = {};
    Object.defineProperty(obj, 'myProperty', {
      value: 'Muutumatu väärtus',
      writable: false, // Muudab omaduse muutumatuks
      enumerable: true, // Omadus on nähtav iteratsioonil
      configurable: true // Omadust saab kustutada või muuta selle kirjeldajat
    });
    
    // Katsed muuta väärtust ignoreeritakse mitte-kriitilises režiimis
    // ja põhjustab viga TypeError kriitilises režiimis
    obj.myProperty = 'Uus väärtus';
    console.log(obj.myProperty); // Väljundib "Muutumatu väärtus"
    

    Kui määrate configurable: false, ei saa omadust kustutada ega muuta selle kirjeldajat:

    const obj2 = {};
    Object.defineProperty(obj2, 'myProperty', {
      value: 'Muutumatu ja kergesti kustutamatu',
      writable: false,
      enumerable: true,
      configurable: false // Muudab kirjeldaja muutumatuks
    });
    
    // Katsed muuta väärtust
    obj2.myProperty = 'Uus väärtus';
    console.log(obj2.myProperty); // Väljundib "Muutumatu ja kergesti kustutamatu"
    
    // Katsed kustutada omadus
    delete obj2.myProperty;
    console.log(obj2.myProperty); // Väljundib "Muutumatu ja kergesti kustutamatu"
    
  2. Kasutades Object.freeze():

    See meetod muudab objekti "jäädunud". See tähendab, et ei saa lisada uusi omadusi, kustutada olemasolevaid, muuta olemasolevate omaduste väärtusi (sh nende loetavust ja konfigureeritavust), ning muuta objekti prototüüpi:

    const obj = {
      myProperty: 'Muutumatu väärtus'
    };
    
    Object.freeze(obj);
    
    // Katsed muuta väärtust
    obj.myProperty = 'Uus väärtus';
    console.log(obj.myProperty); // Väljundib "Muutumatu väärtus"
    
    // Katsed lisada uus omadus
    obj.newProperty = 'Uus';
    console.log(obj.newProperty); // Väljundib `undefined`
    
    // Katsed kustutada omadus
    delete obj.myProperty;
    console.log(obj.myProperty); // Väljundib "Muutumatu väärtus"
    

    Oluline on märkida, et Object.freeze() on pindmine. Kui omadus on teine objekt, ei jää see jäädunud:

  3. Kasutades const muutujat, mis hoiab objekti:

    Sõna const muudab viite objekti muutumatuks, kuid ise objekt on muutuv. Te ei saa viidet muuta, kuid saate muuta objekti omadusi:

    const obj = {
      myProperty: 'Algväärtus'
    };
    
    // Võite muuta omaduse väärtust
    obj.myProperty = 'Uus väärtus';
    console.log(obj.myProperty); // Väljundib "Uus väärtus"
    
    // Viidet ei saa muuta
    // obj = { teineOmadus: 'Teine' }; // Annab TypeError
    

Võrdlustabel meetodite kohta:

Meetod Mida teeb? Muutumatuse tase
Object.defineProperty() Üks konkreetne omadus Kirjeldaja kaudu
Object.freeze() Kogu objekt Pindmine
const Viide objekti Muutuv

Valik sõltub sellest, kui detailselt soovite muutumatust. Ühele omadusele sobib Object.defineProperty(), kogu objekti jaoks Object.freeze(). Viite muutmise vältimiseks kasutage const.