Middle
Kaip uždrausti objekto keitimą JavaScript?
sobes.tech AI
Atsakymas iš AI
Galite naudoti įmontuotus Object metodus:
Object.preventExtensions(obj): Užkerta kelią pridėti naujų savybių prie objekto, bet leidžia keisti ir naikinti esamas.Object.seal(obj): Užkerta kelią pridėti ir naikinti savybes, bet leidžia keisti esamas. Iš esmės tai yrapreventExtensions+ užkirsti kelią naikinti.Object.freeze(obj): Užkerta kelią pridėti, naikinti ir keisti savybes. Padaro objektą neplėtinį. Tai yraseal+ užkirsti kelią keisti esamas savybes.
Pavyzdys:
// Pradinė objektas
let myObject = { name: 'Alice', age: 30 };
// preventExtensions
Object.preventExtensions(myObject);
myObject.city = 'London'; // Nebus veiksmo griežtame režime, negriežtame režime tiesiog ignoruos.
// seal
let mySealedObject = { name: 'Bob', age: 25 };
Object.seal(mySealedObject);
mySealedObject.age = 26; // Veiks
delete mySealedObject.name; // Nebus veiksmo griežtame režime.
mySealedObject.city = 'Paris'; // Nebus veiksmo griežtame režime.
// freeze
let myFrozenObject = { name: 'Charlie', age: 35 };
Object.freeze(myFrozenObject);
myFrozenObject.age = 36; // Nebus veiksmo griežtame režime.
delete myFrozenObject.name; // Nebus veiksmo griežtame režime.
myFrozenObject.city = 'New York'; // Nebus veiksmo griežtame režime.
Svarbu prisiminti, kad Object.freeze nėra gili. Jei objektas turi nuorodas į kitus objektus, šie vidiniai objektai gali būti keičiami, jei jie patys nėra užšaldyti. Giliam užšaldymui reikalinga rekursinė funkcija:
// Pavyzdys giliam užšaldymui
function deepFreeze(obj) {
Object.freeze(obj); // Užšaldome dabartinį objektą
for (const key in obj) {
if (Object.prototype.hasOwnProperty.call(obj, key)) {
const prop = obj[key];
// Jei savybė yra objektas (ir nėra null), rekursyviai užšaldome
if (typeof prop === 'object' && prop !== null && !Object.isFrozen(prop)) {
deepFreeze(prop);
}
}
}
}
let nestedObject = {
name: 'Deep',
details: {
level: 1
}
};
deepFreeze(nestedObject);
nestedObject.details.level = 2; // Nebus veiksmo griežtame režime.
Lyginamoji lentelė:
| Metodas | Pridėti savybes | Ištrinti savybes | Keisti savybes |
|---|---|---|---|
Object.preventExtensions() |
Ne | Taip | Taip |
Object.seal() |
Ne | Ne | Taip |
Object.freeze() |
Ne | Ne | Ne |