Sobes.tech
Middle

Hogyan lesz az objektum tulajdonsága változtathatatlan?

sobes.tech MI

Válasz az MI-től

Hogyan lehet egy objektum tulajdonságát változatlanná tenni többféleképpen:

  1. Object.defineProperty() használata:

    Ez a módszer lehetővé teszi az objektum tulajdonságainak definiálását vagy módosítását finomabb ellenőrzéssel. Változatlan tulajdonság létrehozásához a tulajdonság leíróját writable: false értékre kell állítani.

    const obj = {};
    Object.defineProperty(obj, 'myProperty', {
      value: 'Változatlan érték',
      writable: false, // Változatlanná teszi a tulajdonságot
      enumerable: true, // Látható lesz az iteráció során
      configurable: true // Törölhető vagy módosítható a leíró
    });
    
    // A változtatási kísérlet figyelmen kívül marad nem szigorú módban
    // és TypeError-t fog kiváltani szigorú módban
    obj.myProperty = 'Új érték';
    console.log(obj.myProperty); // "Változatlan érték" lesz
    

    Ha configurable: false értéket adunk meg, a tulajdonság nem törölhető vagy módosítható (beleértve a writable-t is).

    const obj2 = {};
    Object.defineProperty(obj2, 'myProperty', {
      value: 'Változatlan és nehezen törölhető',
      writable: false,
      enumerable: true,
      configurable: false // Változatlanná teszi a leíróját
    });
    
    // A változtatási kísérlet
    obj2.myProperty = 'Új érték';
    console.log(obj2.myProperty); // "Változatlan és nehezen törölhető"
    
    // Tulajdonság törlésének kísérlete
    delete obj2.myProperty;
    console.log(obj2.myProperty); // "Változatlan és nehezen törölhető"
    
  2. Object.freeze() használata:

    Ez a módszer "lefagyasztja" az objektumot. Ez azt jelenti, hogy nem lehet új tulajdonságokat hozzáadni, meglévőket törölni, meglévő tulajdonságokat módosítani (beleértve azok enumerability-jét és konfigurálhatóságát), valamint az objektum prototípusát módosítani.

    const obj = {
      myProperty: 'Változatlan érték'
    };
    
    Object.freeze(obj);
    
    // A változtatási kísérlet
    obj.myProperty = 'Új érték';
    console.log(obj.myProperty); // "Változatlan érték"
    
    // Új tulajdonság hozzáadásának kísérlete
    obj.newProperty = 'Új';
    console.log(obj.newProperty); // undefined
    
    // Tulajdonság törlésének kísérlete
    delete obj.myProperty;
    console.log(obj.myProperty); // "Változatlan érték"
    

    Fontos megjegyezni, hogy a Object.freeze() felszíni. Ha az objektum egyik tulajdonsága másik objektum, akkor ez a belső objektum nem lesz lefagyasztva.

  3. const használata objektumot tartalmazó változóknál:

    A const kulcsszó a referencia változatlanságát biztosítja az objektumhoz, de nem az objektum magához. Nem fogja lehetővé tenni a változó másik objektumra való átállítását, de a tulajdonságokat módosíthatja.

    const obj = {
      myProperty: 'Kezdeti érték'
    };
    
    // A tulajdonság értékének módosítása lehetséges
    obj.myProperty = 'Új érték';
    console.log(obj.myProperty); // "Új érték"
    
    // A változó átállítása nem lehetséges
    // obj = { másTulajdonság: 'Más' }; // TypeError-t fog eredményezni
    

Metódusok összehasonlítása:

Módszer Mit tesz változatlanná? Változatlanság szintje
Object.defineProperty() Egy adott tulajdonságot Leíró szerint definiálva
Object.freeze() Az egész objektum Sík felületű
const A referencia az objektumra Változó

A módszer kiválasztása attól függ, hogy mennyire kell részletes legyen a változatlanság. Egy tulajdonsághoz a Object.defineProperty() megfelelő, az egész objektumhoz a Object.freeze(). A referencia átállásának megakadályozására a const használható.