Middle
JavaScript'te bir nesnenin değiştirilmesini nasıl engelleyebilirsiniz?
sobes.tech yapay zeka
AI'dan gelen yanıt
Yerleşik Object yöntemlerini kullanabilirsiniz:
Object.preventExtensions(obj): Nesneye yeni özelliklerin eklenmesini engeller, ancak mevcut özellikleri değiştirmeye ve silmeye izin verir.Object.seal(obj): Özellik eklemeyi ve silmeyi engeller, ancak mevcut özellikleri değiştirmeye izin verir. Aslında bupreventExtensions+ silmeyi engellemedir.Object.freeze(obj): Özellik eklemeyi, silmeyi ve değiştirmeyi engeller. Nesneyi derinlemesine değişmez hale getirir. Buseal+ mevcut özellikleri değiştirme yasağıdır.
Kullanım örneği:
// Başlangıç nesnesi
let myObject = { name: 'Alice', age: 30 };
// preventExtensions
Object.preventExtensions(myObject);
myObject.city = 'London'; // Katı modda çalışmaz, yumuşak modda görmezden gelinir.
// seal
let mySealedObject = { name: 'Bob', age: 25 };
Object.seal(mySealedObject);
mySealedObject.age = 26; // Çalışır
delete mySealedObject.name; // Katı modda çalışmaz.
mySealedObject.city = 'Paris'; // Katı modda çalışmaz.
// freeze
let myFrozenObject = { name: 'Charlie', age: 35 };
Object.freeze(myFrozenObject);
myFrozenObject.age = 36; // Katı modda çalışmaz.
delete myFrozenObject.name; // Katı modda çalışmaz.
myFrozenObject.city = 'New York'; // Katı modda çalışmaz.
Unutulmaması gereken önemli nokta, Object.freeze'in derin olmadığıdır. Nesne başka nesnelere referanslar içeriyorsa, bu iç içe nesneler de dondurulmadıkça değiştirilebilir. Derin dondurma için özyinelemeli bir fonksiyon gerekir.
// Derin dondurma örneği
function deepFreeze(obj) {
Object.freeze(obj); // Mevcut nesneyi dondur
for (const key in obj) {
if (Object.prototype.hasOwnProperty.call(obj, key)) {
const prop = obj[key];
// Özellik bir nesne ise (null değilse), özyinelemeli olarak dondur
if (typeof prop === 'object' && prop !== null && !Object.isFrozen(prop)) {
deepFreeze(prop);
}
}
}
}
let nestedObject = {
name: 'Deep',
details: {
level: 1
}
};
deepFreeze(nestedObject);
nestedObject.details.level = 2; // Katı modda çalışmaz.
Karşılaştırma tablosu:
| Yöntem | Özellik ekleme | Özellik silme | Özellik değiştirme |
|---|---|---|---|
Object.preventExtensions() |
Hayır | Evet | Evet |
Object.seal() |
Hayır | Hayır | Evet |
Object.freeze() |
Hayır | Hayır | Hayır |