24 Temmuz 2024

Yapıcı, "new" operatörü

{ ... } yazımı bir objenin yaratılmasına yarar. Fakat bir objenin benzeri farklı objeler yaratmak istenebilir. Örneğin farklı kullanıcılar, farklı menü değerleri.

Bu yapıcı fonksiyon ve "new" operatörü ile yapılabilir.

Yapıcı fonksiyon

Yapıcı fonksiyonlar(Constructor) teknik olarak normal fonksiyonlardır. Tabi bazı farklılıkları vardır:

  1. Büyük harfle başlayarak adlandırılırlar.
  2. Sadece "new" operatörü kullanıldığında çalışırlar.

Örneğin:

function Kullanici(isim) {
  this.isim = isim;
  this.yoneticiMi = false;
}

let kullanici = new Kullanici("İhsan");

alert(kullanici.isim); // İhsan
alert(kullanici.yoneticiMi); // false

Fonksiyon new Kullanici(...) şeklinde çalıştığında, aşağıdaki adımlar izlenir:

  1. Yeni bir obje yaratılır ve this bu obje olur.
  2. Fonksiyon gövdesi çalışır. Genelde this modifiye edilir ve yeni özellikler eklenir.
  3. this değeri dönderilir.

Diğer bir deyişle, new Kullanici(...) şöyle yapar:

function Kullanici(isim) {
  // this = {};  (üstü kapalı)

  // bu objeye yeni özellikler ekle
  this.isim = isim;
  this.yoneticiMi = false;

  // return this;  (üstü kapalı)
}

Öyleyse `new Kullanici(“İhsan”) objesi aşağıdaki gibidir:

let kullanici = {
  isim: "Jack",
  yoneticiMi: false
};

Eğer başka bir kullanici oluşturmak istiyorsanız, yapmanız gereken new Kullanici("Macide"), new Kullanici("Muzaffer") gibi kullanmaktır. Doğrudan her defasında obje tanımlamaktan daha kısa ve anlaşılması kolaydır.

Yapıcı fonksiyonların amacı – tekrar kullanılabilecek objeleri yaratan kodun uygulanmasıdır.

Dikkat edecek olursanız, herhangi bir fonksiyon yapıcı fonksiyon olarabilir. Her fonksiyon new ile çalıştırılabilir, ve yukarda anlatılan algoritmaya göre çalışır. “Yapıcı fonksiyon isimleri büyük harfle başlamalıdır” aslında genel bir ittifaktır, bunu daha da açıklayıcı yapmak için bu fonksiyonlar new ile çağırılmalıdır.

new function() { … }

Eğer birçok satırdan oluşan kodda amacınız sadece karmaşık bir obje yapmak ise, bunları yapıcı fonksiyon içine aşağıdaki gibi almak mümkündür:

let kullanici = new function() {
  this.isim = "İhsan";
  this.yonetici = false;

  // diğer karmaşık yapılar
  // mantıklar veya yerel değişkenler
};

Yapıcı fonksiyon tekrar çağırılamaz çünkü hiçbir yere kayıt edilmemiştir, sadece yaratılır ve çağırılır. Böylece yapıcı metod ilerde tekrar kullanılmayacağına garanti verir.

Yapıcı modu testi: new.target

İleri düzey konular

Bu olay çok nadir kullanılır. Eğer her şeyi öğrenmek istemiyorsanız burayı geçebilirsiniz.

Fonksiyon içinde, bu fonksiyon new ile mi yoksa new olmadan mı çağırılmış bu new.target özelliği kullanılarak anlaşılabilir.

Normal çağrılarda bunun içerisi boştur fakat new ile çağrılırsa:

function Kullanici() {
  alert(new.target);
}

// new kullanılmadan:
User(); // new.target undefined döndürür.

// new kullanılarak:
new User(); // function Kullanici { ... } gibi ekrana fonksiyonu yazar

new ve normal sözdiziminin(syntax) aynı çalışmasını sağlar:

function Kullanici(isim) {
  if (!new.target) { // eğer çart yerine getirilmezse
    return new Kullanici(isim); // ...yeni birisi eklenir.
  }

  this.isim = isim;
}

let ihsan = Kullanici("John"); // çağrıyı new Kullanici(isim) fonksiyonuna yönlendirir.
alert(ihsan.isim); // İhsan

Bu yaklaşım bazı kütüphanelerde yazımı daha esnek yapabilmek amacıyla kullanılır. Her yerde kullanılması o kadar da iyi değildir. Çünkü new ne olup bittiği hakkında bilgi vermektedir. new ile yeni bir obje yaratıldığını anlayabiliyorsunuz ki bu da iyi bir şeydir.