Sobes.tech
Middle

Kako učiniti svojstvo objekta nepromenjivim?

sobes.tech АИ

Одговор од АИ

Kako učiniti svojstvo objekta nemogućim za promenu može se postići na više načina:

  1. Korišćenje Object.defineProperty():

    Ova metoda omogućava definisanje ili modifikaciju svojstava objekta sa finijom kontrolom. Za kreiranje svojstva koje se ne može menjati, potrebno je postaviti deskriptor svojstva na writable: false.

    const obj = {};
    Object.defineProperty(obj, 'myProperty', {
      value: 'Nemoguća vrednost',
      writable: false, // Čini svojstvo nemogućim za promenu
      enumerable: true, // Svojstvo će biti vidljivo pri iteraciji
      configurable: true // Svojstvo može biti obrisano ili modifikovano
    });
    
    // Pokušaj promene vrednosti će biti ignorisan u ne-strikt režimu
    // i izazvati grešku TypeError u strikt režimu
    obj.myProperty = 'Nova vrednost';
    console.log(obj.myProperty); // Ispisaće "Nemoguća vrednost"
    

    Ako postavite configurable: false, svojstvo se ne može obrisati ili promeniti njegov deskriptor (uključujući writable).

    const obj2 = {};
    Object.defineProperty(obj2, 'myProperty', {
      value: 'Nemoguće i teško obrisati',
      writable: false,
      enumerable: true,
      configurable: false // Čini deskriptor svojstva nemogućim za promenu
    });
    
    // Pokušaj promene vrednosti
    obj2.myProperty = 'Nova vrednost';
    console.log(obj2.myProperty); // Ispisaće "Nemoguće i teško obrisati"
    
    // Pokušaj brisanja svojstva
    delete obj2.myProperty;
    console.log(obj2.myProperty); // Ispisaće "Nemoguće i teško obrisati"
    
  2. Korišćenje Object.freeze():

    Ova metoda "zamrzava" ceo objekat. To znači da ne možete dodavati nove svojstva, brisati postojeća, menjati vrednosti postojećih svojstava (uključujući njihovu enumerability i konfigurabilnost), kao ni menjati prototip objekta.

    const obj = {
      myProperty: 'Nemoguća vrednost'
    };
    
    Object.freeze(obj);
    
    // Pokušaj promene vrednosti
    obj.myProperty = 'Nova vrednost';
    console.log(obj.myProperty); // Ispisaće "Nemoguća vrednost"
    
    // Pokušaj dodavanja novog svojstva
    obj.newProperty = 'Novi';
    console.log(obj.newProperty); // undefined
    
    // Pokušaj brisanja svojstva
    delete obj.myProperty;
    console.log(obj.myProperty); // Ispisaće "Nemoguća vrednost"
    

    Važno je napomenuti da je Object.freeze() površno. Ako svojstvo objekta predstavlja drugi objekat, taj unutrašnji objekat neće biti zamrznut.

  3. Korišćenje const za promenljive koje sadrže objekat:

    Ključna reč const čini referencu na objekat nemogućom za promenu, ali ne i sam objekat. Nećete moći da preusmerite promenljivu na drugi objekat, ali možete menjati svojstva samog objekta.

    const obj = {
      myProperty: 'Početna vrednost'
    };
    
    // Možete promeniti vrednost svojstva
    obj.myProperty = 'Nova vrednost';
    console.log(obj.myProperty); // "Nova vrednost"
    
    // Nije moguće preusmeriti promenljivu
    // obj = { drugaSvojstvo: 'Drugo' }; // Izazvaće TypeError
    

Upoređenje metoda:

Metod Šta čini nemogućim za promenu? Nivo nemogućnosti
Object.defineProperty() Jedno konkretno svojstvo Definiše se putem deskriptora
Object.freeze() Ceo objekat Površno
const Referenca na objekat Promenljiva

Izbor metode zavisi od toga koliko granularno želiš da bude nemogućnost promene. Za jedno svojstvo je prikladno Object.defineProperty(), za ceo objekat Object.freeze(). Za sprečavanje preusmeravanja reference koristi se const.