Modern JavaScriptte protitipi __proto__ kullanarak ( bir nceki blmde anlatld gibi ) ayarlayabiliriz. Fakat bu daha ncesinde byle deildi.
JavaScript balangcndan beri kaltma sahipti. Bu dilin ekirdek zelliklerinden biriydi.
Fakat bunu ayarlamak iin sadece bir yol vard ve bu yol yapcda(constructor)'da "prototype" kullanmakt. Hala birok kodda bu ekilde kullanlmaktadr.
Prototip zellii
Bildiiniz gibi, new F() yeni bir obje oluturur.
new F() ile yeni bir obje yaratldnda, objenin [[Prototype]]' F.prototype a ayarlanr.
Dier bir deyile, eer F prototype zelliine sahip ve bu da obje tipine ayarlanmsa, new operatr bunu [[Prototype]] ayarlamak iin kullanr.
Aklnzda bulunsun F.prototype burada Fin sahip olduu sradan bir "prototype" objesidir. prototype terimine ok benzese de aslnda burada gerekten kullanlan sradan bir objedir.
rnein:
let animal = {
eats: true
};
function Rabbit(name) {
this.name = name;
}
Rabbit.prototype = animal;
let rabbit = new Rabbit("White Rabbit"); // rabbit.__proto__ == animal
alert( rabbit.eats ); // true
Rabbit.prototype = animal szck anlamyla: Eer yeni bir Rabbit yaratlrsa new Rabbit, bunun [[Prototype]]n animala ata
Sonu u ekildedir:
Grselde "prototip" yataydaki oktur, sranda bir zelliktir. [[Prototype]] ise dikeydir ve rabbitin animaldan miras aldn ifade eder.
Sradan F.prototype, yapc (contructor) zellii
Her fonksiyonun "prototype" zellii bulunmaktadr. Siz belirtmeseniz bile bu geerlidir.
Varsaylan "prototype" sadececontructor` zellii olan olan ve bu da fonksiyonun kendisini gsteren bir objedir.
u ekilde:
function Rabbit() {}
/* varsaylan prototip
Rabbit.prototype = { constructor: Rabbit };
*/
u ekilde kontrol edebiliriz:
function Rabbit() {}
// varsaylan:
// Rabbit.prototype = { constructor: Rabbit }
alert( Rabbit.prototype.constructor == Rabbit ); // true
Eer hibir ey yapmazsak doal olarak contructor zellii tm rabbit objelerine [[Prototype]] vastasyla iletilir.
function Rabbit() {}
// varsaylan:
// Rabbit.prototype = { constructor: Rabbit }
let rabbit = new Rabbit(); // {constructor: Rabbit}'dan miras alr.
alert(rabbit.constructor == Rabbit); // true (prototype'tan gelir)
Eer constructor zelliini kullarak varolan yapc ile ayn ekilde bir obje yapabiliriz.
u ekilde:
function Rabbit(name) {
this.name = name;
alert(name);
}
let rabbit = new Rabbit("White Rabbit");
let rabbit2 = new rabbit.constructor("Black Rabbit");
Bir obje var fakat bu objenin ( 3. parti ktphanelerden gelebilir) hangi yapcsnn kullanldn bilmiyorsak ve aynsn yaratmak istiyorsak olduka kullanldr.
Muhtemelen "contructor" hakkndaki en nemli ey
JavaScript "contructor" deerinin doru olduuna garanti vermez.
Evet, varsaylan "prototype" da bulunur fakat hepsi budur, sonrasndaki her ey bize aittir.
Daha zelde, eer prototipi tamamen deitirirsek, bu durumda iinde "contructor" olmayacaktr.
rnein:
function Rabbit() {}
Rabbit.prototype = {
jumps: true
};
let rabbit = new Rabbit();
alert(rabbit.constructor === Rabbit); // false
yleyse doru "contructor"' tutmak iin varsaylan prototipe zellik ekleme/karma yoluna gidebiliriz. Tamamen zerine yazarsak varsaylan obje kaybolur.
function Rabbit() {}
// Rabbit.prototype zerine dorudan yazma!
// sadece ekle
Rabbit.prototype.jumps = true
// varsaylan Rabbit.prototype.contructor bu ekilde korunacaktr.
Veya alternatif olarak, constructor zellii tekrar yaratlabilir:
Rabbit.prototype = {
jumps: true,
constructor: Rabbit
};
// bu ekilde constructor doru olur, nk bunu el ile belirtmekteyiz.
zet
Bu blmde ksaca yapc fonksiyonlar ile oluturulan objelerin [[Prototip]]'lerinin nasl ayarlanabileceinden bahsettik. lerde bunlarn daha gelimiini programlama kalplar zerinde reneceksiniz.
Her ey aslnda ok basit, birka cmle ile daha net anlatmak gerekirse:
F.prototypezellii[[Prototype]]ile ayn deildir.F.prototypeaslndanew F()arldnda[[Prototype]]' ayarlar.F.prototypedeeri ya obje ya da null olmaldr: dier deerler almaz."prototype"zellii sadece bir yapc fonksiyona ayarland venewile arldnda zel etkisi olur.
Normal objeler prototypen ayr bir nemi yoktur:
let user = {
name: "John",
prototype: "Bla-bla" // hibir bys yok
};
Varsaylan durumda tm fonksiyonlar F.prototype = { constructor: F} eklinde tanmldr, bundan dolay, bir objenin yapcsna "constructor" zellii ile eriilebilir.
Yorumlar
<code>kullannz, birka satr eklemek iin ise<pre>kullann. Eer 10 satrdan fazla kod ekleyecekseniz plnkr kullanabilirsiniz)