Aklımda Kalası Kelimeler

* давайте работать вместе
* Zarf ve Mazruf, Zerafet(xHoyratlık) ile aynı kökten(za-ra-fe) gelir
* Bedesten
* Suç subuta ermiştir - Suç sabit olmuştur
Object.create etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
Object.create etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

11 Mayıs 2013 Cumartesi

Neden this veya prototype kullanırız?

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/