Prototype nedir ?
prototip, ilk örnek, asıl örnek, orijinal
javascript'de objelere yeni değişkenler ve metodlar ekleyeme yarar. object oriented javascript'in temelini oluşturur bu terim. aynı zamanda prototype adıyla (prototype javascript framework) sonrasında gelen jquery, yui gibi yeni nesil javascript kütüphanelerinin öncülüğünü yapan bir araç vardır. daha hızlı javascript yazılması sağlar. daha hızlı yazılmasını javascriptteki uzun uzun yazılan ve çok kullanılan css selection özelliklerini $() gibi fonksiyonlara indirerek ve kullanılabilecek her yerde json kullanarak sağlar.
Prototype'ı bir binanın iskeletine benzetebiliriz, hatta bu benzetmeye tahmin ediyorum birkaç yüz dökümanda daha rastlayabilirsiniz çünkü
prototype benzetmeden daha öte, fonksiyonların iskeletidir.
Prototype değerlerinin tipi objedir.Yani bir objeyi alıp, bir fonksiyonun iskeleti olarak kullanmak mümkündür.Tabii bunun tam tersi durum da
sözkonusu.
Fonksiyonların klonlanarak objeye dönüştürülmesini anlatırken bir detayı atlamıştık; objenin özellikleri fonksiyonun tanımlandığı blokta olmak
zorunda değil.Oluşturduğumuz fonksiyonun iskeletine ulaşabilir ve çeşitli eklemeler yapabiliriz.Şimdi adım adım bir fonksiyon yazalım ve konsolun
döndürdüğü değerleri yorumlayalım:
>>> var kisi = function(adsoyad,yas,dogumyeri){
this.adsoyad = adsoyad;
this.yas = yas;
this.dogumyeri = dogumyeri;
}
>>> kisi.prototype
Object: There are no properties to show for this object.
Örnekte kisi adında bir fonksiyon oluşturup içine adsoyad,yas,dogumyeri özelliklerini yazdık.Ardındaki satırda prototype'ı incelediğimizde, boş bir
objenin döndüğünü görüyoruz.Bu durumdan şunu çıkarmalıyız, iskeletin inşası
prototype objesi dışında yapılamaz.Veya şöyle özetleyelim,
fonksiyonun içinde iskelet oluşturamayız.
>>> kisi.prototype.meslek = null;
Yukaridaki örnekte
prototype objesinin altında bir alan açarak, kisi fonksiyonuna meslek adında bir özellik ekledik.
>>> kisi.prototype
Object: (meslek = null)
>>> selcuk = new kisi("selçuk koçulu",48,"mardin");
>>> selcuk.meslek
null
Bu örnekteyse selcuk adında bir obje oluşturduk ve meslek özelliğini sorguladık.Dönen sonucun null -bu bizim belirlediğimiz bir varsayılan
değerdi- olduğunu görüyoruz.
Buradaki problem, iskelete sonradan eklenen meslek özelliğini constructor'a nasıl dahil edeceğimiz.Bu iş için constructor'ın yeniden yazılması
kaçınılmazdır;
>>> var kisi = function(adsoyad,yas,dogumyeri,meslek){
this.adsoyad = adsoyad;
this.yas = yas;
this.dogumyeri = dogumyeri;
this.meslek = meslek;
}
>>> fikretkizilok = new kisi("fikret kızılok","60","İstanbul","Müzisyen");
>>> fikretkizilok.meslek
"müzisyen"
Bu örnekte dikkat etmemiz gereken, kisi fonksiyonunun eski iskeleti devralması.Peki bu durumda henüz tanımlanmamış fonksiyonların iskeleti
oluşturulabilir mi? Evet, oluşturulabilir.
Bunu denemek için yeni bir fonksiyon yazalım:
>>> kargo.prototype.alan = null;
>>> kargo.prototype.gonderen = null;
>>> kargo.prototype.kargoicerigi = null;
>>> function kargo(alan,gonderen,kargoicerigi){
this.alan = alan;
this.gonderen = gonderen;
this.kargoicerigi = kargoicerigi;
}
>>> kargo.prototype.ucret
0
Görüldüğü gibi, undefined değeri olan bir tanıtıcı altında iskelet oluşturduk ve ardından bu tanıtıcıya fonksiyon değeri verdik.Son satırda ise,
tanıtıcı değer almadan oluşturduğumuz iskeletin çalışır durumda olduğunu onayladık.Biraz önce yazdığımız kisi nesnesinden de faydalanarak
kargo'nun kullanımına bir örnek verelim:
>>> var azerkoculu = new kisi("azer koçulu",20,"kaş","web geliştirici");
>>> var billgates = new kisi("bill gates",53,"seattle","işadamı");
>>> var yeniKargo = new kargo(azerkoculu,billgates,"mozilla stickers");
...
Bir sonraki yazı Prototype ve Browser Nesneleri