Modern JavaScriptâte protitipâi __proto__ kullanarak ( bir önceki bölümde anlatıldıÄı gibi ) ayarlayabiliriz. Fakat bu daha öncesinde böyle deÄildi.
JavaScript baÅlangıcından beri kalıtıma sahipti. Bu dilin çekirdek özelliklerinden biriydi.
Fakat bunu ayarlamak için sadece bir yol vardı ve bu yol yapıcıda(constructor)'da "prototype" kullanmaktı. Hala birçok kodda bu Åekilde kullanılmaktadır.
âPrototipâ özelliÄi
BildiÄiniz gibi, new F() yeni bir obje oluÅturur.
new F() ile yeni bir obje yaratıldıÄında, objeânin [[Prototype]]'ı F.prototype a ayarlanır.
DiÄer bir deyiÅle, eÄer F prototype özelliÄine sahip ve bu da obje tipine ayarlanmıÅsa, new operatörü bunu [[Prototype]] ayarlamak için kullanır.
Aklınızda bulunsun F.prototype burada Fâin sahip olduÄu sıradan bir "prototype" objesidir. âprototypeâ terimine çok benzese de aslında burada gerçekten kullanılan sıradan bir objedir.
ÃrneÄin:
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 sözcük anlamıyla: âEÄer yeni bir Rabbit yaratılırsa new Rabbit, bunun [[Prototype]]ını animalâa ataâ
Sonuç Åu Åekildedir:
Görselde "prototip" yataydaki oktur, sıranda bir özelliktir. [[Prototype]] ise dikeydir ve rabbitâin animalâdan miras aldıÄını ifade eder.
Sıradan F.prototype, yapıcı (contructor) özelliÄi
Her fonksiyonun "prototype" özelliÄi bulunmaktadır. Siz belirtmeseniz bile bu geçerlidir.
Varsayılan "prototype" sadececontructor` özelliÄi olan olan ve bu da fonksiyonun kendisini gösteren bir objedir.
Åu Åekilde:
function Rabbit() {}
/* varsayılan prototip
Rabbit.prototype = { constructor: Rabbit };
*/
Åu Åekilde kontrol edebiliriz:
function Rabbit() {}
// varsayılan:
// Rabbit.prototype = { constructor: Rabbit }
alert( Rabbit.prototype.constructor == Rabbit ); // true
EÄer hiçbir Åey yapmazsak doÄal olarak contructor özelliÄi tüm rabbit objelerine [[Prototype]] vasıtasıyla iletilir.
function Rabbit() {}
// varsayılan:
// Rabbit.prototype = { constructor: Rabbit }
let rabbit = new Rabbit(); // {constructor: Rabbit}'dan miras alır.
alert(rabbit.constructor == Rabbit); // true (prototype'tan gelir)
EÄer constructor özelliÄini kullarak varolan yapıcı 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 kütüphanelerden gelebilir) hangi yapıcısının kullanıldıÄını bilmiyorsak ve aynısını yaratmak istiyorsak oldukça kullanıÅlıdır.
Muhtemelen "contructor" hakkındaki en önemli Åeyâ¦
⦠JavaScript "contructor" deÄerinin doÄru olduÄuna garanti vermez.
Evet, varsayılan "prototype" da bulunur fakat hepsi budur, sonrasındaki her Åey bize aittir.
Daha özelde, eÄer prototipâi tamamen deÄiÅtirirsek, bu durumda içinde "contructor" olmayacaktır.
ÃrneÄin:
function Rabbit() {}
Rabbit.prototype = {
jumps: true
};
let rabbit = new Rabbit();
alert(rabbit.constructor === Rabbit); // false
Ãyleyse doÄru "contructor"'ı tutmak için varsayılan prototipâe özellik ekleme/çıkarma yoluna gidebiliriz. Tamamen üzerine yazarsak varsayılan obje kaybolur.
function Rabbit() {}
// Rabbit.prototype üzerine doÄrudan yazma!
// sadece ekle
Rabbit.prototype.jumps = true
// varsayılan Rabbit.prototype.contructor bu Åekilde korunacaktır.
Veya alternatif olarak, constructor özelliÄi tekrar yaratılabilir:
Rabbit.prototype = {
jumps: true,
constructor: Rabbit
};
// bu Åekilde constructor doÄru olur, çünkü bunu el ile belirtmekteyiz.
Ãzet
Bu bölümde kısaca yapıcı fonksiyonlar ile oluÅturulan objelerin [[Prototip]]'lerinin nasıl ayarlanabileceÄinden bahsettik. İlerde bunların daha geliÅmiÅini programlama kalıpları üzerinde öÄreneceksiniz.
Her Åey aslında çok basit, birkaç cümle ile daha net anlatmak gerekirse:
F.prototypeözelliÄi[[Prototype]]ile aynı deÄildir.F.prototypeaslındanew F()çaÄırıldıÄında[[Prototype]]'ı ayarlar.F.prototypedeÄeri ya obje ya da null olmalıdır: diÄer deÄerler çalıÅmaz."prototype"özelliÄi sadece bir yapıcı fonksiyona ayarlandıÄı venewile çaÄırıldıÄında özel etkisi olur.
Normal objeler prototypeâın ayrı bir önemi yoktur:
let user = {
name: "John",
prototype: "Bla-bla" // hiçbir büyüsü yok
};
Varsayılan durumda tüm fonksiyonlar F.prototype = { constructor: F} Åeklinde tanımlıdır, bundan dolayı, bir objenin yapıcısına "constructor" özelliÄi ile eriÅilebilir.
Yorumlar
<code>kullanınız, birkaç satır eklemek için ise<pre>kullanın. EÄer 10 satırdan fazla kod ekleyecekseniz plnkr kullanabilirsiniz)