Sobes.tech
Middle

Jak udělat vlastnost objektu neměnnou?

sobes.tech AI

Odpověď od AI

Jak učinit vlastnost objektu nemměnnou, lze několika způsoby:

  1. Použití Object.defineProperty():

    Tato metoda umožňuje definovat nebo změnit vlastnosti objektu s jemnější kontrolou. Pro vytvoření neměnné vlastnosti je třeba nastavit descriptor vlastnosti na writable: false.

    const obj = {};
    Object.defineProperty(obj, 'myProperty', {
      value: 'Neměnná hodnota',
      writable: false, // Dělá vlastnost neměnnou
      enumerable: true, // Vlastnost bude viditelná při průchodu
      configurable: true // Vlastnost lze smazat nebo změnit její descriptor
    });
    
    // Pokus o změnu hodnoty bude ignorován v ne-striktním režimu
    // a vyvolá chybu TypeError v striktním režimu
    obj.myProperty = 'Nová hodnota';
    console.log(obj.myProperty); // Vypíše "Neměnná hodnota"
    

    Pokud nastavíte configurable: false, vlastnost nebude možné smazat nebo změnit její descriptor (včetně writable).

    const obj2 = {};
    Object.defineProperty(obj2, 'myProperty', {
      value: 'Neměnná a těžko smazatelná',
      writable: false,
      enumerable: true,
      configurable: false // Dělá descriptor vlastnosti neměnným
    });
    
    // Pokus o změnu hodnoty
    obj2.myProperty = 'Nová hodnota';
    console.log(obj2.myProperty); // Vypíše "Neměnná a těžko smazatelná"
    
    // Pokus o smazání vlastnosti
    delete obj2.myProperty;
    console.log(obj2.myProperty); // Vypíše "Neměnná a těžko smazatelná"
    
  2. Použití Object.freeze():

    Tato metoda "zamrazí" celý objekt. To znamená, že nelze přidávat nové vlastnosti, mazat existující, měnit hodnoty stávajících vlastností (včetně jejich enumerability a konfigurovatelnosti), ani měnit prototyp objektu.

    const obj = {
      myProperty: 'Neměnná hodnota'
    };
    
    Object.freeze(obj);
    
    // Pokus o změnu hodnoty
    obj.myProperty = 'Nová hodnota';
    console.log(obj.myProperty); // Vypíše "Neměnná hodnota"
    
    // Pokus o přidání nové vlastnosti
    obj.newProperty = 'Nové';
    console.log(obj.newProperty); // undefined
    
    // Pokus o smazání vlastnosti
    delete obj.myProperty;
    console.log(obj.myProperty); // Vypíše "Neměnná hodnota"
    

    Je důležité poznamenat, že Object.freeze() je povrchové. Pokud je vlastnost objektu jiný objekt, tento vnitřní objekt nebude zamražen.

  3. Použití const pro proměnné obsahující objekt:

    Klíčové slovo const činí odkaz na objekt neměnným, nikoliv samotný objekt. Nemůžete přenastavit proměnnou na jiný objekt, ale můžete měnit vlastnosti samotného objektu.

    const obj = {
      myProperty: 'Počáteční hodnota'
    };
    
    // Může změnit hodnotu vlastnosti
    obj.myProperty = 'Nová hodnota';
    console.log(obj.myProperty); // Vypíše "Nová hodnota"
    
    // Nelze přenastavit proměnnou
    // obj = { jináVlastnost: 'Jiná' }; // Vyvolá TypeError
    

Porovnání metod:

Metoda Co dělá neměnné? Úroveň neměnnosti
Object.defineProperty() Jednu konkrétní vlastnost Definuje se pomocí descriptoru
Object.freeze() Celý objekt Povrchové
const Odkaz na objekt Proměnná

Výběr metody závisí na tom, jak granularní má být neměnnost. Pro jednu vlastnost je vhodné Object.defineProperty(), pro celý objekt Object.freeze(). Pro zabránění přepsání odkazu se používá const.