Sobes.tech
Middle+

Tanımlayıcılar hakkında ne biliyorsun?

sobes.tech yapay zeka

AI'dan gelen yanıt

JavaScript'te tanımlayıcılar, bir nesnenin özelliklerini tanımlayan nesnelerdir; bunlar değer (value), yazılabilirlik (writable), dizilebilirlik (enumerable) ve yapılandırılabilirlik (configurable) gibi özellikleri içerir. Ayrıca getter ve setter içeren tanımlayıcılar da vardır.

İki tür tanımlayıcı vardır:

  • Veri tanımlayıcılar: Özelliğin değerini içerir.

    • value: Özelliğin değeri. Herhangi geçerli veri tipi olabilir.
    • writable: Bir boolean değer. Eğer true ise, özellik değeri değiştirilebilir (obj.prop = newValue). Varsayılan olarak, erişim özellikleri için false ve normal atamalarla oluşturulan veri özellikleri için truedir.
    • enumerable: Bir boolean değer. Eğer true ise, özellik nesne özellikleri arasında gezinirken görünür (örneğin, for...in döngüsü veya Object.keys() kullanılarak). Varsayılan olarak, Object.defineProperty ile eklenen özellikler için false ve normal atamalarla oluşturulanlar için truedir.
    • configurable: Bir boolean değer. Eğer true ise, tanımlayıcının özellikleri (değer ve writable hariç) değiştirilebilir ve özellik silinebilir. Varsayılan olarak, Object.defineProperty ile eklenen özellikler için false ve normal atamalarla oluşturulanlar için truedir. Bir kez yapılandırıldığında, değiştirilemez hale gelir. true'dan false'a writable'ı azaltabilirsiniz, ancak get/set'te non-configurable ise, tersini yapamazsınız.
  • Aksesör tanımlayıcılar: Özelliğin alınması (getter) veya ayarlanması (setter) sırasında çağrılacak fonksiyonları tanımlar.

    • get: Özelliğin okunması sırasında çağrılan fonksiyon. Bu fonksiyonun argümanı yoktur.
    • set: Özelliğe yazılırken çağrılan fonksiyon. Bir argüman alır, bu yeni değeri temsil eder.
    • enumerable: Bir boolean değer (veri tanımlayıcılarına benzer).
    • configurable: Bir boolean değer (veri tanımlayıcılarına benzer).

Tanımlayıcılar karıştırılamaz: Bir özellik ya value ve writable'a sahip olur, ya da get ve set'e.

Tanımlayıcılar, nesnenin özelliklerini daha düşük seviyede yönetmek için kullanılır; özellikle Object.defineProperty(), Object.defineProperties(), Object.getOwnPropertyDescriptor(), Object.getOwnPropertyDescriptors(), Object.create() metodlarıyla.

Bir veri tanımlayıcıyla özellik oluşturma örneği:

// Boş bir nesne oluştur
const obj = {};

// 'name' özelliğini veri tanımlayıcısı ile tanımla
Object.defineProperty(obj, 'name', {
  value: 'Alice',
  writable: false, // Özellik değiştirilemez
  enumerable: true, // Özellik listelenebilir
  configurable: false // Özelliğin özellikleri değiştirilemez ve silinemez
});

console.log(obj.name); // Çıktı: Alice

// Özelliği değiştirmeye çalışma (strict modda yok sayılır veya hata verir)
obj.name = 'Bob';
console.log(obj.name); // Çıktı: Alice

// Özelliği silmeye çalışma (yok sayılır veya hata verir)
delete obj.name;
console.log(obj.name); // Çıktı: Alice

Aksesör tanımlayıcısı ile özellik oluşturma örneği:

// Özel bir değişken ile nesne oluştur
const user = {
  _firstName: 'John', // Anlaşmaya göre özel değişken
  _lastName: 'Doe'
};

// 'fullName' özelliğini aksesör tanımlayıcısı ile tanımla
Object.defineProperty(user, 'fullName', {
  get() {
    // Getter: tam adı döndürür
    return `${this._firstName} ${this._lastName}`;
  },
  set(value) {
    // Setter: tam adı bölüp özel değişkenleri günceller
    const parts = value.split(' ');
    this._firstName = parts[0];
    this._lastName = parts[1];
  },
  enumerable: true, // Listelenebilir
  configurable: true // Değiştirilebilir ve silinebilir
});

console.log(user.fullName); // Çıktı: John Doe

user.fullName = 'Peter Pan';
console.log(user._firstName); // Çıktı: Peter
console.log(user._lastName); // Çıktı: Pan
console.log(user.fullName); // Çıktı: Peter Pan

Tanımlayıcıların kullanımı, değiştirilemez özellikler, tembel hesaplama özellikleri, erişim kontrolü (getter/setter) özellikleri oluşturmayı ve nesnelerin davranışını daha esnek yönetmeyi sağlar.