Sobes.tech
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:

  1. Object.preventExtensions(obj): Nesneye yeni özelliklerin eklenmesini engeller, ancak mevcut özellikleri değiştirmeye ve silmeye izin verir.
  2. Object.seal(obj): Özellik eklemeyi ve silmeyi engeller, ancak mevcut özellikleri değiştirmeye izin verir. Aslında bu preventExtensions + silmeyi engellemedir.
  3. Object.freeze(obj): Özellik eklemeyi, silmeyi ve değiştirmeyi engeller. Nesneyi derinlemesine değişmez hale getirir. Bu seal + 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