Middle
Kako zabraniti promenu objekta u JavaScript-u?
sobes.tech АИ
Одговор од АИ
Може да се користе уграђене методе Object:
Object.preventExtensions(obj): Забрањује додавање нових својстава на објекат, али дозвољава измене и брисање постојећих.Object.seal(obj): Забрањује додавање и брисање својстава, али дозвољава измене постојећих. У суштини то јеpreventExtensions+ забрана брисања.Object.freeze(obj): Забрањује додавање, брисање и измене својстава. Чини објекат неглубоко имутабилним. Ово јеseal+ забрана измена постојећих својстава.
Пример употребе:
// Почетни објекат
let myObject = { name: 'Alice', age: 30 };
// preventExtensions
Object.preventExtensions(myObject);
myObject.city = 'London'; // Неће радити у строгом режиму, у нестрогом ће бити игнорисано.
// seal
let mySealedObject = { name: 'Bob', age: 25 };
Object.seal(mySealedObject);
mySealedObject.age = 26; // Радиће
delete mySealedObject.name; // Неће радити у строгом режиму.
mySealedObject.city = 'Paris'; // Неће радити у строгом режиму.
// freeze
let myFrozenObject = { name: 'Charlie', age: 35 };
Object.freeze(myFrozenObject);
myFrozenObject.age = 36; // Неће радити у строгом режиму.
delete myFrozenObject.name; // Неће радити у строгом режиму.
myFrozenObject.city = 'New York'; // Неће радити у строгом режиму.
Важно је запамтити да Object.freeze није дубоко. Ако објекат садржи референце на друге објекте, ти унутрашњи објекти могу се мењати ако сами нису замрзнути. За дубоко замрзавање потребна је рекурзивна функција.
// Пример дубоког замрзавања
function deepFreeze(obj) {
Object.freeze(obj); // Замрзавамо тренутни објекат
for (const key in obj) {
if (Object.prototype.hasOwnProperty.call(obj, key)) {
const prop = obj[key];
// Ако је својство објекат (и није null), рекурзивно га замрзавамо
if (typeof prop === 'object' && prop !== null && !Object.isFrozen(prop)) {
deepFreeze(prop);
}
}
}
}
let nestedObject = {
name: 'Deep',
details: {
level: 1
}
};
deepFreeze(nestedObject);
nestedObject.details.level = 2; // Неће радити у строгом режиму.
Упоредна табела:
| Метод | Додавање својстава | Брисање својстава | Промена својстава |
|---|---|---|---|
Object.preventExtensions() |
Не | Да | Да |
Object.seal() |
Не | Не | Да |
Object.freeze() |
Не | Не | Не |