Middle
Как можете да забраните промяната на обект в JavaScript?
sobes.tech AI
Отговор от AI
Може да се използват вградени методи 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() |
Не | Не | Не |