Sobes.tech
Middle

Come rendere una proprietà di un oggetto immutabile?

sobes.tech AI

Risposta dell'AI

È possibile rendere una proprietà di un oggetto immutabile in diversi modi:

  1. Utilizzando Object.defineProperty():

    Questo metodo permette di definire o modificare le proprietà di un oggetto con un controllo più granulare. Per creare una proprietà immutabile, bisogna impostare il descrittore della proprietà con writable: false.

    const obj = {};
    Object.defineProperty(obj, 'myProperty', {
      value: 'Valore immutabile',
      writable: false, // Rende la proprietà immutabile
      enumerable: true, // La proprietà sarà visibile durante l'iterazione
      configurable: true // La proprietà potrà essere eliminata o modificato il suo descrittore
    });
    
    // Tentativo di cambiare il valore sarà ignorato in modalità non stretta
    // e causerà un errore TypeError in modalità stretta
    obj.myProperty = 'Nuovo valore';
    console.log(obj.myProperty); // Mostrerà "Valore immutabile"
    

    Se si imposta configurable: false, la proprietà non potrà essere eliminata né modificato il suo descrittore (incluso writable).

    const obj2 = {};
    Object.defineProperty(obj2, 'myProperty', {
      value: 'Inalterabile e non facilmente eliminabile',
      writable: false,
      enumerable: true,
      configurable: false // Rende il descrittore della proprietà immutabile
    });
    
    // Tentativo di cambiare il valore
    obj2.myProperty = 'Nuovo valore';
    console.log(obj2.myProperty); // Mostrerà "Inalterabile e non facilmente eliminabile"
    
    // Tentativo di eliminare la proprietà
    delete obj2.myProperty;
    console.log(obj2.myProperty); // Mostrerà "Inalterabile e non facilmente eliminabile"
    
  2. Utilizzando Object.freeze():

    Questo metodo "congela" l'oggetto. Ciò significa che non si possono aggiungere nuove proprietà, eliminare quelle esistenti, modificare i valori delle proprietà esistenti (inclusa la loro enumerabilità e configurabilità), né modificare il prototipo dell'oggetto.

    const obj = {
      myProperty: 'Valore immutabile'
    };
    
    Object.freeze(obj);
    
    // Tentativo di cambiare il valore
    obj.myProperty = 'Nuovo valore';
    console.log(obj.myProperty); // Mostrerà "Valore immutabile"
    
    // Tentativo di aggiungere una nuova proprietà
    obj.newProperty = 'Nuovo';
    console.log(obj.newProperty); // Mostrerà undefined
    
    // Tentativo di eliminare la proprietà
    delete obj.myProperty;
    console.log(obj.myProperty); // Mostrerà "Valore immutabile"
    

    È importante notare che Object.freeze() è superficiale. Se una proprietà dell'oggetto è un altro oggetto, tale oggetto interno non sarà congelato.

  3. Utilizzando const per variabili che contengono oggetti:

    La parola chiave const rende la referenza all'oggetto immutabile, ma non l'oggetto stesso. Non si può riassegnare la variabile a un altro oggetto, ma si possono modificare le proprietà dell'oggetto.

    const obj = {
      myProperty: 'Valore iniziale'
    };
    
    // È possibile modificare il valore della proprietà
    obj.myProperty = 'Nuovo valore';
    console.log(obj.myProperty); // Mostrerà "Nuovo valore"
    
    // Non si può riassegnare la variabile
    // obj = { altraProprieta: 'Altro' }; // Genera TypeError
    

Confronto tra metodi:

Metodo Cosa rende immutabile? Livello di immutabilità
Object.defineProperty() Una singola proprietà Determinato dal descrittore
Object.freeze() L'intero oggetto Superficiale
const La referenza all'oggetto Variabile

La scelta del metodo dipende da quanto deve essere granulare l'immutabilità. Per una singola proprietà, Object.defineProperty(), per l'intero oggetto, Object.freeze(). Per prevenire la riassegnazione della referenza, si usa const.