{ ... } 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:
- Büyük harfle başlayarak adlandırılırlar.
- 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:
- Yeni bir obje yaratılır ve
thisbu obje olur. - Fonksiyon gövdesi çalışır. Genelde
thismodifiye edilir ve yeni özellikler eklenir. thisdeğ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.
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
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.
Yapıcı metodun return sözcüğü
Genelde yapıcı metodların return sözcüğü yoktur. Amaçları gerekli olan bilgileri this içine yazmaktır ve bu da otomatik olarak sonuçtur.
Fakat return sözcüğü var ise kurallar basittir:
- Eğer
returnobje ile çağırılırsathisyerine bu obje döndürülür. - Eğer
returnilkel bir obje ile çağırılırsa görmezden gelinir.
Diğer bir deyişle, obje ile return kullanıldığında obje döner, diğer tüm hallerde this döner.
Örneğin aşağıda return edilen obje this yerine dönderilir.
function BuyukKullanici() {
this.isim = "İhsan";
return { isim: "Muhsin" }; // <-- obje dönderir
}
alert( new BuyukKullanici().isim ); // Muhsin, objeyi aldık ^^
Şimdi ise boş bir return cümlesi yazalım( eğer ilkel bir tipte kullanılsa bir şey değiştirmez)
function KucukKullanici() {
this.isim = "İhsan";
return; // çalışmayı bitirir ve `this`'i döndürür.
}
alert( new KucukKullanici().isim ); // İhsan
Genelde yapıcılar return sözcüğü kullanmazlar. Buarada amaç bütünlüğün sağlanması için geçerli olan özel bir davranıştır.
Bu arada new’den sonra eğer bir argüman yoksa parantez kullanmasanız da olur:
let kullanici = new Kullanici; // <-- parantez yok
// aynı şey.
let kullanici = new Kullanici();
Parantezleri yazmamak “iyi yazım stili” değildir. Fakat bu şekilde yazım da mümkündür.
Yapıcı içerisinde metod
Yapıcı fonksiyon kullanmak objeye mükemmel esneklik sağlar. Yapıcı fonksiyon parametreleri tanımlar ve objenin nasıl yapılacağını, ne konulması gerektiğini belirtir.
Tabiki this’e sadece özelliklerde değil metodlar içerisinde de ekleme yapılabilir.
Örneğin, aşağıdaki new User(isim) verilen isim ile yeni bir obje oluşturur. Bu obje selamVer metoduna sahiptir.
function Kullanici(isim) {
this.isim = isim;
this.selamVer = function() {
alert( "Benim adım: " + this.isim );
};
}
let ihsan = new Kullanici("ihsan");
ihsan.selamVer(); // Benim adım: İhsan
/*
ihsan = {
name: "İhsan",
selamVer: function() { ... }
}
*/
Özet
- Yapıcı fonksiyonlar, veya kısaca yapıcılar, normal fonksiyonlardır. Fakat baş haflerinin büyük olmasıyla ilgili ortak bir kullanım vardır.
- Bu fonksiyonlar sadece
newkullanılarak çağırılmalıdır. Böyle çağrılar önce boş birthisyaratır ve buna değerler eklendikten sonra buthis’i geri gönderir.
Yapıcılar ile benzer objeler yapmak mümkündür.
JavaScript kendi içerisindeki objeler için yapıcı fonksiyon desteği verir. Örneğin: Tarihler için Date, setler için Set vs.
Bu bölümde basitçe yapıcılar nasıl yaratılır bunlar hakkında konuşuldu. Bir sonraki bölümde daha fazla veri tipi ve fonksiyonlar hakkında bilgi verilecektir.
"object-oriented-programming" adresindeki makale bulunamadı bölümde objelere geri dönülmiş ve derinlemesine incelenmiştir.
Yorumlar
<code>kullanınız, birkaç satır eklemek için ise<pre>kullanın. Eğer 10 satırdan fazla kod ekleyecekseniz plnkr kullanabilirsiniz)