PERFORMANS
Eğer bir A fonksyionundan new ile birçok nesne tanımlayacaksak, A fonksiyonunda
this.xxx
ile tanımlı her fonksiyon tüm nesneler için tek tek oluşturulur.
var A = function () {
this.x = function () {
//do something
};
};
// Aşağıdaki tanımlamada tek bir fonksiyon tüm örnekler için kullanılır
// ve bu şekilde memory daha az kullanılır.
var A = function () { };
A.prototype.x = function () {
//do something
};
Ref:
http://jsperf.com/prototype-vs-this
GİZLEMEK
Fonksiyon içindeki private değişkenleri, public fonksiyonlardan gizlemek istersek, prototype içinde public fonksiyonlarını tanımlarız. Böylece A fonksyonu içindeki private_var erişilmez olur. Sadece A içinde this ile tanımlı kaynaklara prototype içinde tanımlı fonksiyonlar erişir.
__proto__ ne işe yarar
Bir fonksiyonun prototype özelliği otomatik olarak tanımlanır ve içindeki bilgiler o fonksiyondan üretilen nesnelere geçer. Üretilen her nesne __proto__ bilgisi içinde fonksyionun prototype özelliğindeki nesneyi saklar ve aranan her property eğer birinci seviyede nesnede yoksa __proto__ içinde aranır. Bulunamazsa __proto__.__proto__ içinde ve en son __proto__ ya kadar aranır.
prototype.constructor ne işe yarar
Fonksiyonun varsayılan özelliği prototype idi ve constructor ile __proto__ dan oluşuyordu.
Fonksiyonun atasını prototype içinden öğreniyoruz.
Function dan miras alınanlar:
Eğer prototype özelliğini başka bir fonksiyondan olma nesne ile ezersek:
Eğer daha
A
fonksiyonunun prototype'ını
B
fonksiyonuyla ezip,
A
fonksiyonundan olma bir
a
nesnesinin constructor fonksiyonundan
c
nesnesi yaratmak istersek,
elbetteki
B
fonksiyonundan üretilmiş olacak çünkü A'nın prototype özelliğini B yapmıştık.
Kısaca constructor ile objenin atasına ait fonksiyona bağ kurmuş oluyoruz. Eğer nesnenin üstünden new ile bir başka nesne yaratmak istersek constructor fonksiyonu işimize yarayacaktır.
Javascript Sınıflarında prototype atanması
1)
2)
Sınıfların durumunu daha derin incelersek:
Herhangi bir inheritance(miras, kalıtım) uygulanmadığı için B sınıfı varsayılan olarak Object sınıfından miras alır. Bu durumda B'den yaratılacak nesneler için ilk aranacak metotlar B sınıfının içindekiler sonra B'nin miras aldığı Object sınıfı içindekiler olacak.
Nesnenin daima __proto__ su vardır ve inherit ettiği sınıfların bilgilerini barındırır.
Bir nesne içinde property araması yapıldığında önce kendi içinde (hasOwnProperty) sonra inherit ettiği sınıfların içinde propertylerde arama yapar.
var b = new B();
b.__proto__
B {}
b.__proto__.__proto__
Object {}
b.__proto__.__proto__.__proto__
null
Object.create ile inheritance:
new Operatörüyle inheritance:
B nin prototype'ı için Object.create ile A yı B sınıfının atası olarak tayin ettiğimizde, A dan bir nesne yaratılmaz ve tüm property leri B sınıfından yaratılan nesnelere geçirilmez.
Miras alan sınıfa, sanki atadan geliyormuş gibi yeni fonksiyon ve özellikler eklemek
Object.create(param1,param2)
param1: Miras alınan sınıf
param2: Sanki miras alınan sınıftan geliyormuş gibi eklenen fonksiyon ve özellikler. Dikkat edilecek nokta: Miras alınan sınıfa yeni eklenen fonksiyon ve özellikler geçmez!
KALITIMI YOK ETMEK
null veya Object.create(null) ile sınıfın, ata sınıfla ilişiği kesildiği anda, prototype'ı null yapılan sınıflardan türetilen nesnelerin __proto__ özelliği Object ile yer değişir.
Güzel Kaynaklar:
http://javascriptweblog.wordpress.com/2010/06/07/understanding-javascript-prototypes/
http://dailyjs.com/2012/06/04/js101-object-create/
http://www.javascripture.com/