Middle
Kuidas keelata objekti muutmine JavaScriptis?
sobes.tech AI
Vastus AI-lt
Jūs varat izmantot iebūvētos Object metodes:
Object.preventExtensions(obj): Aizliedz pievienot jaunas īpašības objektam, bet ļauj mainīt un dzēst esošās.Object.seal(obj): Aizliedz pievienot un dzēst īpašības, bet ļauj mainīt esošās. Būtībā tas irpreventExtensions+ aizliegums dzēst.Object.freeze(obj): Aizliedz pievienot, dzēst un mainīt īpašības. Padara objektu neizmaināmu dziļi. Tas irseal+ aizliegums mainīt esošās īpašības.
Piemērs:
// Sākotnējais objekts
let myObject = { name: 'Alice', age: 30 };
// preventExtensions
Object.preventExtensions(myObject);
myObject.city = 'London'; // Nedarbojas stingrā režīmā, ne stingrā režīmā vienkārši tiks ignorēts.
// seal
let mySealedObject = { name: 'Bob', age: 25 };
Object.seal(mySealedObject);
mySealedObject.age = 26; // Darbosies
delete mySealedObject.name; // Nevarēs stingrā režīmā.
mySealedObject.city = 'Paris'; // Nevarēs stingrā režīmā.
// freeze
let myFrozenObject = { name: 'Charlie', age: 35 };
Object.freeze(myFrozenObject);
myFrozenObject.age = 36; // Nevarēs stingrā režīmā.
delete myFrozenObject.name; // Nevarēs stingrā režīmā.
myFrozenObject.city = 'New York'; // Nevarēs stingrā režīmā.
Svarīgi atcerēties, ka Object.freeze nav dziļš. Ja objekts satur atsauces uz citām objektiem, šie iekšējie objekti var tikt mainīti, ja tie paši nav aizsaluši. Lai dziļi aizsalītu, nepieciešama rekursīva funkcija:
// Piemērs dziļai aizsalšanai
function deepFreeze(obj) {
Object.freeze(obj); // Aizsalst pašreizējo objektu
for (const key in obj) {
if (Object.prototype.hasOwnProperty.call(obj, key)) {
const prop = obj[key];
// Ja īpašība ir objekts (un nav null), rekursīvi aizsalst
if (typeof prop === 'object' && prop !== null && !Object.isFrozen(prop)) {
deepFreeze(prop);
}
}
}
}
let nestedObject = {
name: 'Deep',
details: {
level: 1
}
};
deepFreeze(nestedObject);
nestedObject.details.level = 2; // Nevarēs stingrā režīmā.
Salīdzināšanas tabula:
| Metode | Pievienot īpašības | Dzēst īpašības | Mainīt īpašības |
|---|---|---|---|
Object.preventExtensions() |
Nē | Jā | Jā |
Object.seal() |
Nē | Nē | Jā |
Object.freeze() |
Nē | Nē | Nē |