{ ... } 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)