Mehmet

WFN Üye
Konular
1,851
Mesajlar
1,852
Çözüm
0
Ticaret Puanı
0
Üyelik
1 Ay 6 Gün
Konum
YurtDışı
Web Sitesi
Var
Alanı
Google Adsense
1/1
Konu sahibi
JavaScript’te constructor, yeni nesneyi oluşturma ve başlangıç değerlerini hazırlama rolünü anlatır. Bir class içindeki constructor bu iş için özel metottur; new ile çağrılan uygun fonksiyonlar da yapıcı olarak kullanılabilir. En yaygın kullanım şekli, bir class içinde tanımlanması ve new operatörüyle yeni nesne üretilmesidir. Örneğin kullanıcı adı ve e-posta gibi bilgileri her nesne için başlangıçta ayarlamak istiyorsanız bunu constructor içinde yaparsınız.

Temel kullanım​


Kod:
class User {
  constructor(name, email) {
    this.name = name;
    this.email = email;
  }

  describe() {
    return `${this.name} - ${this.email}`;
  }
}

const user = new User("Ayşe", "[email protected]");

console.log(user.name);
console.log(user.describe());

Bu kodda new User(...) çalıştırıldığında yeni bir User nesnesi oluşturulur. Constructor içindeki this, oluşturulan bu yeni nesneyi gösterir. this.name ve this.email atamaları, nesnenin başlangıç özelliklerini oluşturur.

Beklenen çıktı şöyledir:

Kod:
Ayşe
Ayşe - [email protected]

İlk satırda isim doğru görünüyorsa constructor parametresinin nesne özelliğine aktarıldığını anlarsınız. undefined görürseniz genellikle nesneyi oluştururken parametre vermemiş veya özellik adını yanlış yazmışsınızdır.

Constructor nasıl çalışır?​


Temel bir sınıftan new ile nesne üretme işlemi, aşağıdaki gibi basitleştirilebilir. Miras alan sınıfta this bağlantısının kurulması ayrıca super çağrısına bağlıdır:
  1. Yeni bir nesne oluşturur.
  2. Bu nesneyi sınıfın prototype zincirine bağlar.
  3. Constructor parametrelerini alır.
  4. Constructor içindeki başlangıç atamalarını çalıştırır.
  5. Hazırlanan nesneyi sonuç olarak döndürür.
Constructor yazmazsanız JavaScript çoğu durumda sınıf için varsayılan bir constructor sağlar. Bu nedenle başlangıçta özel bir işlem yapmayacaksanız constructor eklemek zorunlu değildir.

Sınıf ve constructor ilişkisini şu şekilde düşünebilirsiniz:
KavramGöreviÖrnek
classNesnelerin yapısını ve davranışlarını tanımlarclass User
constructorYeni nesnenin ilk değerlerini hazırlarconstructor(name)
newSınıftan yeni nesne üretirnew User("Ayşe")

Miras alınan sınıflarda super kullanımı​


Bir sınıf başka bir sınıfı extends ile miras alıyorsa, alt sınıfın constructor'ında this kullanılmadan önce super() çağrılmalıdır.

Kod:
class Animal {
  constructor(name) {
    this.name = name;
  }
}

class Dog extends Animal {
  constructor(name, breed) {
    super(name);
    this.breed = breed;
  }
}

const dog = new Dog("Karabaş", "Kangal");
console.log(dog.name);  // Karabaş
console.log(dog.breed); // Kangal

Burada super(name), üst sınıf olan Animal constructor'ını çalıştırır. super() çağrılmadan this.breed yazılırsa ReferenceError oluşur. Çünkü alt sınıfın nesnesi henüz başlatılmamıştır.

Fonksiyon constructor ile farkı​


Yapıcı olarak kullanılan normal fonksiyonlar da vardır ve hâlâ kullanılabilir. Aşağıdaki örneği önceki User tanımından ayrı çalıştırın; aynı kapsamda iki User tanımı yazmayın:

Kod:
function User(name) {
  this.name = name;
}

const user = new User("Mehmet");
console.log(user.name); // Mehmet

Burada fonksiyon new ile çağrıldığı için constructor gibi davranır. Ancak class constructor'ları doğrudan çağrılamaz; User() yerine new User() kullanılmalıdır. Constructor amacınız nesne oluşturmaksa sınıf adını büyük harfle başlatmak, gerekli parametreleri açıkça tanımlamak ve başlangıç atamalarını constructor içinde toplamak okunabilirliği artırır.

Sık yapılan hatalar​


new kullanmamak​


const user = User("Ayşe") biçimi class için hatalıdır ve "class constructors must be invoked with 'new'" türünde hata üretir. Doğru kullanım const user = new User("Ayşe") şeklindedir.

this yerine yanlış değişken kullanmak​


Constructor parametresi ile nesne özelliği aynı ada sahip olabilir. Bu durumda this.name = name yazılmalıdır. Sadece name = name yazmak nesneye özellik eklemez.

Gereksiz constructor yazmak​


Constructor içinde yapılacak başlangıç işlemi yoksa boş bir constructor eklemek yerine sınıfı doğrudan tanımlamak daha temizdir. Miras alınan sınıfta ise kendi başlangıç işlemleriniz varsa super() çağrısını ve ardından alt sınıfa ait atamaları yapın.

Sık sorulan sorular​


Constructor async olabilir mi?​


Class constructor metodu async olamaz. Asenkron veri hazırlanması gerekiyorsa nesneyi bir async fabrika fonksiyonunda oluşturmak veya açıkça çağrılan ayrı bir başlatma metodu tasarlamak mümkündür. Yeni nesneyi kullanan kod hazırlığın tamamlanmasını ayrıca beklemelidir.

Bir class içinde birden fazla constructor olabilir mi?​


Hayır. Bir class içinde yalnızca bir constructor metodu bulunabilir. Farklı parametre senaryoları için varsayılan değerler veya koşullu mantık kullanılabilir.

Constructor içinde return kullanırsam ne olur?​


Normal başlangıç kodunda açık return yazmanız gerekmez. Temel sınıfın constructor’ı bir nesne döndürürse bu nesne oluşturulan örneğin yerini alabilir; ilkel değer dönüşü ise yok sayılır. Miras alan sınıfın constructor’ında nesne olmayan, undefined dışındaki bir değer döndürmek TypeError üretir. Bu nedenle “her return aynı şekilde davranır” varsayımıyla tasarım yapmayın.
 
Güzel ve derli toplu bir özet olmuş, özellikle super() kısmındaki ReferenceError uyarısı çok yerinde. Kendi projelerimde constructor konusunda zamanla şu yaklaşımı benimsedim: constructor'ı olabildiğince hafif tutuyorum, sadece gelen değerleri doğrulayıp varsayılanları atıyorum. Örneğin bir kullanıcı nesnesinde isim boş gelirse varsayılan bir değer veriyorum, böylece ileride undefined yüzünden sayfanın başka bir yerinde hata çıkmıyor. Ağ isteği, dosya okuma gibi ağır veya asenkron işleri ise constructor'a hiç sokmuyorum; onun yerine static bir oluşturma metoduyla nesneyi hazırlayıp döndürüyorum. Bu sayede hem nesne oluşturmak hızlı kalıyor hem de hata ayıklamak kolaylaşıyor. Bir de parametre sayısı artınca nesne parametresi kullanmayı tercih ediyorum, çünkü sıralı beş altı parametre bir süre sonra karıştırılabiliyor. Teşekkürler, faydalı bir konu olmuş.
 

Sende şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Konuyu görüntüleyenler

Bu konuyu şu anda görüntüleyen üye bulunmuyor.