Sobes.tech
Middle

Cum să faci o proprietate a unui obiect neschimbabilă?

sobes.tech AI

Răspuns de la AI

Cum să faceți o proprietate a obiectului imuabilă poate fi realizat în mai multe moduri:

  1. Utilizarea Object.defineProperty():

    Această metodă permite definirea sau modificarea proprietăților unui obiect cu un control mai granular. Pentru a crea o proprietate imuabilă, trebuie să setați descriptorul proprietății cu writable: false.

    const obj = {};
    Object.defineProperty(obj, 'myProperty', {
      value: 'Valoare imuabilă',
      writable: false, // Face proprietatea imuabilă
      enumerable: true, // Proprietatea va fi vizibilă la iterare
      configurable: true // Proprietatea poate fi ștersă sau modificată
    });
    
    // Încercarea de a modifica valoarea va fi ignorată în modul ne-strict
    // și va arunca o eroare TypeError în modul strict
    obj.myProperty = 'Valoare nouă';
    console.log(obj.myProperty); // Va afișa "Valoare imuabilă"
    

    Dacă setați configurable: false, proprietatea nu poate fi ștersă sau modificată (inclusiv writable).

    const obj2 = {};
    Object.defineProperty(obj2, 'myProperty', {
      value: 'Valoare imuabilă și greu de șters',
      writable: false,
      enumerable: true,
      configurable: false // Face descriptorul proprietății imuabil
    });
    
    // Încercarea de a modifica valoarea
    obj2.myProperty = 'Valoare nouă';
    console.log(obj2.myProperty); // Va afișa "Valoare imuabilă și greu de șters"
    
    // Încercarea de a șterge proprietatea
    delete obj2.myProperty;
    console.log(obj2.myProperty); // Va afișa "Valoare imuabilă și greu de șters"
    
  2. Utilizarea Object.freeze():

    Această metodă face obiectul "înghețat". Asta înseamnă că nu se pot adăuga noi proprietăți, nu se pot șterge cele existente, nu se pot modifica valorile proprietăților existente (inclusiv enumerabilitatea și configurabilitatea lor), precum și nu se poate modifica prototipul obiectului.

    const obj = {
      myProperty: 'Valoare imuabilă'
    };
    
    Object.freeze(obj);
    
    // Încercarea de a modifica valoarea
    obj.myProperty = 'Valoare nouă';
    console.log(obj.myProperty); // Va afișa "Valoare imuabilă"
    
    // Încercarea de a adăuga o proprietate nouă
    obj.newProperty = 'Nou';
    console.log(obj.newProperty); // Va afișa undefined
    
    // Încercarea de a șterge proprietatea
    delete obj.myProperty;
    console.log(obj.myProperty); // Va afișa "Valoare imuabilă"
    

    Este important de menționat că Object.freeze() este superficial. Dacă o proprietate a obiectului este alt obiect, acel obiect intern nu va fi înghețat.

  3. Utilizarea const pentru variabile care conțin obiecte:

    Cuvântul cheie const face referința la obiect imuabilă, dar nu și obiectul în sine. Nu veți putea reasigna variabila la un alt obiect, dar puteți modifica proprietățile obiectului.

    const obj = {
      myProperty: 'Valoare inițială'
    };
    
    // Se poate modifica valoarea proprietății
    obj.myProperty = 'Valoare nouă';
    console.log(obj.myProperty); // Va afișa "Valoare nouă"
    
    // Nu se poate reasigna variabila
    // obj = { altăProprietate: 'Altceva' }; // Va arunca TypeError
    

Comparativ între metode:

Metodă Ce face imuabil? Nivel de imuabilitate
Object.defineProperty() O proprietate specifică Se definește prin descriptor
Object.freeze() Întregul obiect Superficial
const Referința la obiect Variabilă

Alegerea metodei depinde de cât de granulară trebuie să fie imuabilitatea. Pentru o singură proprietate, se pot folosi Object.defineProperty(), pentru întregul obiect - Object.freeze(). Pentru a preveni reasignarea referinței, se folosește const.