Javascript, her ne kadar bazı yüksek uçan programcılar tarafından bir programlama dili olarak görülmese de (hatta bu sözcüğü olur olmadık kullanmanıza kızarlar) oldukça sağlam ve kendisine insanı hayran bırakan gelişmiş özellikleriyle, bir çok programlama diline taş çıkartıyor. Tüm bu kabiliyetlerini biz sineye çekiyor ve mütevazilik adına javascript’e, ismi gereği script dili demeyi tercih ediyoruz.javascript, yapısı gereği, bir uygulama oluşturmaya başladığınız andan itibaren, her işlemi bir nesneye yaptırır. İki adım öteye gitmek için nesnelerden başka seçeneğiniz yoktur. Örneğin bir fonksiyon yazmaya karar verdiniz diyelim.function deneme(){}var deneme = new function(){}var deneme = function(){}
Bir çok şekilde fonksiyonlar tanımlayabildim. Ama dikkat çekmek istediğim bir yöntem var 2. satırdaki “new” ifadesi. Bu ifade javascriptte bir çeşit obje klonlama görevini yerine getirir. İyi ama benim function diye bir objem yoktu ki! Nasıl oluyor da şimdi “new” yazarak bu olmayan (!) objeden bir kopya oluşturma cürretine girdim? En başlarda dedik ya! js’de her şey bir objeden türer. Buna fonksiyonlar da dahildir. “function” js’de hazır gelen bir nesnedir. Sunulan konforlu kodlama olanakları sayesinde her defasında “new” ifadesi kullanmak zorunda değiliz. Örnekten görüldüğü gibi 3 farklı yöntemle aynı işi yapabilmekteyiz. Yani bir nesne kullanmaktan öteye geçmiş hissi de sunuyor. Zaten çoğu kimsenin “function”un bir nesne olduğunu bilmemesinin altında bu neden vardır. Ama dediğimiz gibi işin aslı, bir nesne ile, “function” nesnesi ile çalışmaktayız.Peki sayılar, harfler? Bunlar da mı birer nesneden üretiliyorlar?Evet aynen öyle oluyor!12+2;”abcd12″;”12″+”2″;
Bu örnekte de gördüğümüz değerler rakam ve sayılar için “integer” metinsel ifadeler için “string” sınıflarından türetilmektedir. Dizi değişkenler “Array” sınıfından, true ya da false değeri “boolean” sınıfından türetilir.Şimdi dilerseniz bir fonksiyonun, nasıl bir sınıf gibi kullanılacağını inceleyelim!var zamansal = new Date();var insan = new function(isim,dogum){this.isim = isim;this.dogum = dogum;this.yasKacHemserim = zamansal.getYear() – dogum;}var recep = new insan(“recep”,1987);alert(recep.yasKacHemserim);
Örnekte ilk önce “function” sınıfından bir nesne tanımladık. Henüz tam kavrayamadıysanız siz buna “bir fonksiyon yazdık” da diyebilirsiniz. Ardından fonksiyonumuz için isim, dogum ve yas isimli metodlar tanımladık. Ardından obje tanımlama işimiz bitmiş oluyor ve recep isimli bir değişken tanımlayıp, bu değişkene de insan fonksiyonun bir kopyasını yükledik. Ne tuhaf değil mi? Yukarıda insan değişkenine “function” diye bir şey kopyaladık. Aşağıda da “insan”ı “recep”e kopyaladık.. Tuhaf ama kolay. Artık recep, insan sınıfının özelliklerini kullanabilmektedir. Zira kendisinden yaş sorulduğunda şevkle cevap verebilcek bir durumdadır. Peki fonksiyon içinde fonksiyon tanımlayabiliriz desek? Yine tuhaf geldi değil mi? Peki hazır tanımlanmış bir objeyi devralıp ona kendi kafamıza göre bir iki metod daha ekleyelim, eklediğimiz metodlardan birisine de yine demin devralalım dediğimiz hazır objeyi bir kez daha kopyalayalım! Belki biraz daha akılcı geldi.var insan = new function(){this.meslek = new function(){this.ismi = “Öğrenci”;this.gorevAdresi = “İstanbul – Maslak”;this.calis = new function(){…};};};var recep = new insan();alert(recep.meslek().ismi);recep.meslek().calis();
Ne kadar konforlu değil mi? Gördüğünüz gibi iç içe sonsuza kadar fonksiyonlar tanımlayabiliriz, çünkü bizim fonksiyon dediğimize javascript obje gözüyle bakıyor. İşte bu kolaylığın nedeni burada yatar.En başta “function, js’in hazır gelen bir sınıfıdır” demiştik. İşte bu hazır sınıfın içine, dil tasarımcıları birde hazır metod eklemişler. O metodun ismi “apply”… Apply javascriptin isviçre çakısıdır. Bu hazır fonksiyon ile diğer nesneleri birbirlerinin yapıları üzerine inşa edebiliriz. Bunun saymakla bitmez faydalarından sadece birisi, modern object oriented (nesne yönelimli) dillerin kalıtım özelliğini bize sağlamasıdır.var insan = new function(adsoyad,yas,dogumyeri){this.adsoyad = adsoyad;this.yas = yas;this.dogumyeri = dogumyeri;}var ogrenci = new function(adsoyad,yas,dogumyeri,no,sube){this.no = no;this.sube = sube;insan.apply(this,arguments);}var recep = new insan(“recep ivedik”,15,”İstanbul”,”45688″,”9-E”);
Şimdi buradaki yabancı komutlara bir göz atalım. “arguments” de yine function sınıfının bir alt metodudur ve fonksiyonlara gönderilecek parametreleri dinler. Yani siz ister “function()” demiş olsun, ister “function(ad,soyad)” demiş olun, “arguments” o iki parantezin arasını sürekli dinler ve array sınıfından türetilmiştir. Örneğin bir fonksiyonda parametre değişkeni tanımlamamış olsanız bile, yine de ona veri yollayabilirsiniz. Verilerinizi aralarına virgül ekleyerek ayırmanız yeterlidir. “arguments[0]” şeklinde sırayla parametreleri yakalamak mümkündür ve takdir edersiniz ki, “arguments” yazarak gelen tüm parametreyi insan sınıfına yolluyoruz.. Hemen önündeki this ifadesi de fonksiyonun kendisini ifade ediyor ve apply için gerekli bir parametre..Görüldüğü üzere iki farklı sınıfımız vardı. Birincisi olan “insan” oldukça genel bilgiler içeriyordu. Ama “ogrenci” sınıfımız daha alt bir sınıf olarak görülebilir. Sonuç olarak insanların öğrenci olabileceğini ifade eden bir kodlama yaptık. Diğer meslekleri ve görevleri de eklemek bu kadar basit. Yeni iş sektörleri açılsa bile fark etmez. Hemen tanımlayıp apply ile birleştirmek yeterlidir. Gördüğünüz gibi tam anlamıyla bir kalıtım-gelişim sağlanmıştır.