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:
-
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 (inclusowritable).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" -
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. -
Utilizzando
constper variabili che contengono oggetti:La parola chiave
constrende 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.