Tug'ma prototiplar
prototype xossasi JavaScript yadrosining o'zida keng qo'llaniladi. Barcha tug'ma (native) konstruktor funksiyalar โ Object, Array, Function, Number va boshqalar โ o'z prototype laridan foydalanadi. Aynan shu sababli obyektlar, massivlar va satrlarda ko'plab tayyor metodlar mavjud.
Object.prototype
Bo'sh obyekt yaratganimizda, u aslida bo'sh emas. let obj = {} yozuvi let obj = new Object() bilan bir xil, bu yerda Object โ tug'ma konstruktor funksiya. Uning Object.prototype si toString va boshqa metodlarga ega, ular meros orqali barcha obyektlarga o'tadi:
Demak, zanjir shunday: obj โ Object.prototype โ null. Object.prototype zanjirning eng tepasi โ uning prototipi null.
Boshqa tug'ma prototiplar
Array, Function, Number, String, Boolean kabi tug'ma obyektlar ham o'z metodlarini prototiplarida saqlaydi. Masalan, massiv yaratganimizda [1, 2, 3] aslida new Array(1, 2, 3) ga o'xshaydi va uning barcha metodlari Array.prototype da yashaydi:
Ba'zi metodlar turli prototiplarda takrorlanishi mumkin. Masalan, Array.prototype ning o'z toString i bor โ u massiv elementlarini vergul bilan ajratib qaytaradi. Object.prototype ning toString i esa [object Object] qaytaradi. Zanjir bo'ylab yaqinroqdagisi (Array'niki) ishlatiladi:
[[Prototype]] si Function.prototype bo'lib, u call, apply, bind kabi metodlarni beradi. Shu sababli istalgan funksiyada bu metodlar mavjud.Primitivlar va prototiplar
Satr, son va mantiqiy qiymatlar (primitivlar) obyekt emas. Ammo biz ularning xossa yoki metodlariga murojaat qilsak (masalan, str.toUpperCase()), vaqtinchalik "o'ram" (wrapper) obyekt yaratiladi. U o'z ishini bajaradi va yo'qoladi. Bu o'ram obyektlarning metodlari ham prototiplarda joylashgan: String.prototype, Number.prototype, Boolean.prototype.
null va undefined ning o'ram obyektlari YO'Q โ ularda hech qanday metod yoki xossa yo'q. Ularga murojaat qilsangiz xato yuz beradi.Tug'ma prototiplarni kengaytirish
Tug'ma prototiplarni o'zgartirish (kengaytirish) mumkin. Masalan, String.prototype ga yangi metod qo'shsak, u barcha satrlarda paydo bo'ladi:
Bu kuchli, lekin XAVFLI imkoniyat. Prototiplar global (bir butun dastur uchun umumiy). Ikki xil kutubxona bir xil nomdagi metodni qo'shsa, biri ikkinchisini ustidan yozib, kutilmagan xatolarni keltirib chiqaradi.
Prototiplardan qarz olish (borrowing)
Ba'zan bir tug'ma prototip metodini boshqa obyektga "qarzga" olamiz. Masalan, massivga o'xshash (array-like) obyektga Array.prototype metodlarini qo'llash mumkin:
Bu ishlaydi, chunki join ning ichki algoritmi faqat to'g'ri son indekslar va length xossasini kutadi โ obyekt haqiqiy massiv bo'lishini talab qilmaydi. Bu texnika "metod qarz olish" (method borrowing) deb ataladi.
Xulosa
- Barcha tug'ma obyektlar metodlarini prototiplarida saqlaydi:
Object.prototype,Array.prototype,String.prototypeva h.k.; - Obyektlarning zanjiri eng tepada
Object.prototypega, undan keyinnullga boradi; - Primitivlar metodlarini vaqtinchalik o'ram obyektlar orqali oladi (
String.prototypeva boshqalar); nullvaundefinedda metod yo'q;- Tug'ma prototiplarni kengaytirish mumkin, lekin bu deyarli har doim yomon g'oya โ istisno faqat polyfill'lar;
- Prototip metodlarini boshqa obyektlarga "qarzga" berish mumkin (method borrowing).