Sobes.tech
Middle

Ako spraviť vlastnosť objektu nezmeniteľnou?

sobes.tech AI

Odpoveď od AI

Ako chcete spraviť vlastnosť objektu nemennou, môžete použiť niekoľkými spôsobmi:

  1. Použitie Object.defineProperty():

    Táto metóda umožňuje definovať alebo upravovať vlastnosti objektu s jemnejšou kontrolou. Na vytvorenie nemennej vlastnosti je potrebné nastaviť descriptor vlastnosti na writable: false.

    const obj = {};
    Object.defineProperty(obj, 'myProperty', {
      value: 'Nemenná hodnota',
      writable: false, // Robí vlastnosť nemennou
      enumerable: true, // Vlastnosť bude viditeľná pri prechode
      configurable: true // Vlastnosť môže byť odstránená alebo upravená
    });
    
    // Pokus o zmenu hodnoty bude ignorovaný v ne-striktnom režime
    // a spôsobí chybu TypeError v striktnom režime
    obj.myProperty = 'Nová hodnota';
    console.log(obj.myProperty); // Vypíše "Nemenná hodnota"
    

    Ak nastavíte configurable: false, vlastnosť nebude možné odstrániť alebo upraviť jej descriptor (vrátane writable).

    const obj2 = {};
    Object.defineProperty(obj2, 'myProperty', {
      value: 'Nemenná a ťažko odstrániteľná',
      writable: false,
      enumerable: true,
      configurable: false // Robí descriptor vlastnosti nemenným
    });
    
    // Pokus o zmenu hodnoty
    obj2.myProperty = 'Nová hodnota';
    console.log(obj2.myProperty); // Vypíše "Nemenná a ťažko odstrániteľná"
    
    // Pokus o odstránenie vlastnosti
    delete obj2.myProperty;
    console.log(obj2.myProperty); // Vypíše "Nemenná a ťažko odstrániteľná"
    
  2. Použitie Object.freeze():

    Táto metóda "zamrazí" celý objekt. To znamená, že nie je možné pridávať nové vlastnosti, odstraňovať existujúce, meniť hodnoty existujúcich vlastností (vrátane ich enumerability a konfigurovateľnosti), ako aj meniť prototyp objektu.

    const obj = {
      myProperty: 'Nemenná hodnota'
    };
    
    Object.freeze(obj);
    
    // Pokus o zmenu hodnoty
    obj.myProperty = 'Nová hodnota';
    console.log(obj.myProperty); // Vypíše "Nemenná hodnota"
    
    // Pokus o pridanie novej vlastnosti
    obj.newProperty = 'Nové';
    console.log(obj.newProperty); // undefined
    
    // Pokus o odstránenie vlastnosti
    delete obj.myProperty;
    console.log(obj.myProperty); // Vypíše "Nemenná hodnota"
    

    Je dôležité poznamenať, že Object.freeze() je povrchové. Ak vlastnosť objektu predstavuje iný objekt, tento vnútorný objekt nebude zamrazený.

  3. Použitie const pre premenné obsahujúce objekt:

    Kľúčové slovo const robí odkaz na objekt nemenným, ale nie samotný objekt. Nemôžete preusmerniť premennú na iný objekt, ale môžete meniť vlastnosti samotného objektu.

    const obj = {
      myProperty: 'Počiatočná hodnota'
    };
    
    // Môžete zmeniť hodnotu vlastnosti
    obj.myProperty = 'Nová hodnota';
    console.log(obj.myProperty); // "Nová hodnota"
    
    // Nie je možné preusmerniť premennú
    // obj = { ináVlastnosť: 'Iné' }; // Vyvolá TypeError
    

Porovnanie metód:

Metóda Čo robí nemennym? Úroveň nemennosti
Object.defineProperty() Jednu konkrétnu vlastnosť Definuje sa pomocou deskriptora
Object.freeze() Celý objekt Povrchové
const Odkaz na objekt Premenná

Výber metódy závisí od toho, aká granularita nemennosti je požadovaná. Pre jednu vlastnosť je vhodné Object.defineProperty(), pre celý objekt Object.freeze(). Na zabránenie preusmernenia odkazu sa používa const.