# JavaScript'de Object.freeze(), Object.seal() ve Object.defineProperty() kavramları

Object.freeze(), Object.seal() ve Object.defineProperty() gibi kavramlar, JavaScript nesne yönelimli programlama paradigmalarında oldukça önemlidir. Bu kavramları örneklerle açıklamaya çalışalım.

## **Object.freeze()**

`Object.freeze()` yöntemi, bir nesnenin değiştirilmesini engeller. Yani, bir nesneyi dondurabilirsiniz ve bu nesne üzerinde herhangi bir değişiklik yapılmayacaktır. Bu nesne için mevcut tüm özellikler, yazılımlar tarafından korunacaktır.

```javascript
const person = {
  name: "John",
  age: 30,
  address: {
    city: "New York",
    state: "NY"
  }
};

// person nesnesini dondurma
Object.freeze(person);

// Değişiklik yapmaya çalışalım
person.name = "Mike";
person.address.city = "San Francisco";

console.log(person.name); // John
console.log(person.address.city); // New York
```

Yukarıdaki örnekte, `Object.freeze()` yöntemi kullanılarak `person` nesnesi donduruldu. Ardından, [`person.name`](http://person.name) ve [`person.address.city`](http://person.address.city) özellikleri değiştirildi. Ancak, sonuçta, `person` nesnesindeki özellikler değişmedi. Bu yöntem, değiştirilemez nesneler oluşturmanıza olanak sağlar.

## **Object.seal()**

`Object.seal()` yöntemi, bir nesnenin değiştirilmesini engellemez, ancak özelliklerin eklenmesini veya silinmesini engeller. Bu nesnenin mevcut özellikleri değiştirilebilir, ancak özelliklerine eklenen veya silinen bir değişiklik yapılamaz.

```javascript
const person = {
  name: "John",
  age: 30,
  address: {
    city: "New York",
    state: "NY"
  }
};

// person nesnesini mühürleme
Object.seal(person);

// Değişiklik yapmaya çalışalım
person.name = "Mike";
person.address.city = "San Francisco";
person.gender = "Male";

console.log(person.name); // Mike
console.log(person.address.city); // San Francisco
console.log(person.gender); // undefined
```

Yukarıdaki örnekte, `Object.seal()` yöntemi kullanılarak `person` nesnesi mühürlendi. Ardından, [`person.name`](http://person.name) ve [`person.address.city`](http://person.address.city) özellikleri değiştirildi. Ayrıca `person.gender` özelliği eklendi. Ancak, sonuçta, `person` nesnesi mühürlendiğinden, `person.gender` özelliği tanımlanmadı.

## **Object.defineProperty()**

`Object.defineProperty()` metodu, nesne özelliklerini tanımlamak ve yapılandırmak için kullanılır. Bu metot, bir nesne özelliğinin değerini, yazılabilirliğini, erişilebilirliğini ve yapılandırılabilirliğini tanımlamak için kullanılır.

Örneğin, aşağıdaki örnekte `Object.defineProperty()` metodu kullanarak bir `Person` nesnesi tanımlıyoruz:

```javascript
const Person = {};

Object.defineProperty(Person, 'name', {
  value: 'John',
  writable: false,
  enumerable: true,
  configurable: false
});

console.log(Person.name); // John
Person.name = 'Alice'; // Hata verir
```

Burada, `Person` nesnesine bir `name` özelliği ekledik ve `value` özelliğine `John` değerini atadık. Ayrıca, `writable` özelliğine `false` değerini atayarak, `name` özelliğinin değerinin değiştirilemez olduğunu belirledik. `enumerable` özelliğine `true` değerini atayarak, özelliğin `for...in` döngüsü gibi özellikleri listelemek için kullanılabileceğini belirledik. `configurable` özelliğine `false` değerini atayarak, özelliğin yapılandırılabilirliğini devre dışı bıraktık.

## Sonuç

Bu yazıda JavaScript'te kullanılan önemli üç nesne yöntemi olan `Object.freeze()`, `Object.seal()` ve `Object.defineProperty()`'i inceledik.

* `Object.freeze()` yöntemi, bir nesnenin özelliklerinin değiştirilemez hale getirilmesine yardımcı olur.
    
* `Object.seal()` yöntemi, bir nesnenin özelliklerinin değiştirilemez hale getirilmesine ek olarak yeni özellikler eklenmesini de engeller.
    
* `Object.defineProperty()` yöntemi, bir nesneye yeni özellikler eklemeyi, mevcut özelliklerin değiştirilmesini veya mevcut özellikleri silmeyi sağlar. Bu yöntem aynı zamanda özelliklerin özellikleri, özelliklerin değerlerine erişim kontrolü ve diğer özelliklerin tanımlanması için kullanılabilir.
    

Bu yöntemler sayesinde nesnelerinize ekstra güvenlik ve kontrol ekleyebilirsiniz. Özellikle büyük ölçekli projelerde, nesnelerin kontrol altında tutulması ve yanlışlıkla değiştirilmemesi için bu yöntemlerin kullanılması önemlidir.

Bu konuların derinlemesine anlaşılması ve uygulanması zaman alabilir, ancak uygulamaya başladığınızda farkı görebileceksiniz.
