Middle
Come si può vietare la modifica di un oggetto in JavaScript?
sobes.tech AI
Risposta dell'AI
Puoi usare i metodi incorporati di Object:
Object.preventExtensions(obj): Impedisce l'aggiunta di nuove proprietà all'oggetto, ma permette di modificare ed eliminare quelle esistenti.Object.seal(obj): Impedisce l'aggiunta e l'eliminazione di proprietà, ma permette di modificare quelle esistenti. In pratica, questo èpreventExtensions+ divieto di eliminazione.Object.freeze(obj): Impedisce di aggiungere, eliminare e modificare proprietà. Rende l'oggetto immutabile in profondità. Questo èseal+ divieto di modificare le proprietà esistenti.
Esempio di utilizzo:
// Oggetto iniziale
let myObject = { name: 'Alice', age: 30 };
// preventExtensions
Object.preventExtensions(myObject);
myObject.city = 'London'; // Non avrà effetto in modalità strict, verrà ignorato in modalità non strict.
// seal
let mySealedObject = { name: 'Bob', age: 25 };
Object.seal(mySealedObject);
mySealedObject.age = 26; // Funzionerà
delete mySealedObject.name; // Non funzionerà in modalità strict.
mySealedObject.city = 'Paris'; // Non funzionerà in modalità strict.
// freeze
let myFrozenObject = { name: 'Charlie', age: 35 };
Object.freeze(myFrozenObject);
myFrozenObject.age = 36; // Non funzionerà in modalità strict.
delete myFrozenObject.name; // Non funzionerà in modalità strict.
myFrozenObject.city = 'New York'; // Non funzionerà in modalità strict.
È importante ricordare che Object.freeze è superficiale. Se l'oggetto contiene riferimenti ad altri oggetti, questi oggetti annidati potranno essere modificati se non sono anch'essi congelati. Per il congelamento profondo, è necessaria una funzione ricorsiva.
// Esempio di congelamento profondo
function deepFreeze(obj) {
Object.freeze(obj); // Congela l'oggetto corrente
for (const key in obj) {
if (Object.prototype.hasOwnProperty.call(obj, key)) {
const prop = obj[key];
// Se la proprietà è un oggetto (e non null), la congela ricorsivamente
if (typeof prop === 'object' && prop !== null && !Object.isFrozen(prop)) {
deepFreeze(prop);
}
}
}
}
let nestedObject = {
name: 'Deep',
details: {
level: 1
}
};
deepFreeze(nestedObject);
nestedObject.details.level = 2; // Non funzionerà in modalità strict.
Tabella comparativa:
| Metodo | Aggiunta di proprietà | Eliminazione di proprietà | Modifica di proprietà |
|---|---|---|---|
Object.preventExtensions() |
No | Sì | Sì |
Object.seal() |
No | No | Sì |
Object.freeze() |
No | No | No |