JavaScript Prototype (o'zbek tilida xulosalar)
JavaScriptda objectlar featurelarni prototypelar orqali inherit qilishi mumkin. Har bir objectning o'z prototype bor.
Prototypening o'zi ham object, unda ham prototype bor, bu prototype chain yaratadi va u prototypening prototypi nullga teng bo'lganida to'xtaydi.
Biz object yaratganimizda, unda [[Prototype]] ko'rinishida belgilgangan prototypeni ko'rishimiz mumkin.
Agar biz objectda yo'q bo'lgan propertyga kirishga urinsak, u avval objectdan, agar objectda bo'lmasa uning prototypedan qidirishni boshlaydi va eng oxirgi prototypegacha qidirib boradi, agar yo'q bo'lsa, u bizga null qaytaradi.
JavaScript Object() functioniga qurilgan. Object() object emas, function.
Agar biz Person() function yaratsak va undagi "this"ni paramsga tenglasak, javascript anonymous object yaratadi. Object()dagi kabi, Person()da ham prototype bor va undagi constructor property Person() objectni o'ziga reference qiladi.
Person === Person.prototype.constructor true qiymat qaytaradi.
Ushbu uslubda constructor functionga method qo'shganimizda, u shu orqali yaratilgan objectlarimizda ko'rinmaydi:
Person.prototype.greet = function() {
return "Hi, I'm " + this.name + "!";
}
Agar biz person1 = new Person('John') deb yozadigan bo'lsak, JS engine Personning yangi instanceni yaratadi, person1da greet() method consoleda ko'rinmaydi. Ammo prorotype chain sababli, biz person1.greet() methodni ishga tushirishimiz mumkin, chunki person1da ushbu method yo'qligini ko'rgan JS engine uni prototype chain yordamida Persondan uni topadi va uni ishga tushiradi, agar Personda ham bo'lmasa yana qidirishda davom etadi, agar Object() functionimizda ham bo'lmasa, unda person1.greet is not a function error qaytaradi.
Masalan person1.toString() deb yozsak, toString() methodimiz person1da yo'qligi sababli JS engine uni qidirishni boshlaydi, Personda ham yo'q, qidirishda davom etadi va uni Object()da topadi va ishga tushiradi.
person1.draw() method yaratsak, draw() faqatgina person1ga tegishli bo'ladi, Personga emas. Agar biz objectni o'zidagina method yaratsak, u shu objectdagina available bo'ladi, boshqlarida emas.
Agar biz person1ni o'ziga ham greet() function qo'shadigan bo'lsak, va uni chaqiradigan bo'lsak, u uning constructor functioni bo'lgan Persondan farqli ravishda person1ning o'z shaxsiy greet() methodi ishlaydi va bu narsa shadowing deyiladi. Ya'ni JS engine methodlarni avval o'sha objectning o'zidan izlaydi, bo'lmasa keyin ptototypelarda qidirishiga yana bir misol.