Esingizda bo’lsin, yangi obyektlar new F() kabi konstruktor funktsiyasi bilan yaratilishi mumkin.
Agar F.prototype obyekt bo’lsa, u holda new operator undan yangi obyekt uchun [[Prototype]] ni o’rnatishda foydalanadi.
Javascript boshidan prototip merosga ega edi. Bu tilning asosiy xususiyatlaridan biri edi.
Ammo qadimgi vaqtlarda unga to’g’ridan-to’g’ri kirish imkoni yo’q edi. Ishonchli ishlaydigan yagona narsa, ushbu bobda tasvirlangan konstruktor funktsiyasining "prototype" vxususiyati edi. Shunday qilib, uni ishlatadigan ko’plab skriptlar mavjud
Iltimos e’tibor bering, F.prototype bu yerda F da "prototype" nomli odatiy xususiyatni anglatadi. Bu “prototype” atamasiga o’xshash bir narsaga o’xshaydi, ammo bu yerda biz haqiqatan ham ushbu nomga ega odatiy xususiyatni nazarda tutamiz.
Mana misol:
Rabbit.prototype = animal sozlamasida so’zma-so’z quyidagicha ifodalanadi: “new Rabbit yaratilganda, uning [[Prototype]] ni animal ga belgilang”.
Natijada paydo bo’lgan rasm:
Rasmda "prototype" – gorizontal o’q, odatiy xususiyatni anglatadi va [[Prototype]] vertikal bo’lib, rabbit ning animal dan merosxo’rligini anglatadi.
F.prototypefaqatnew Fvaqtida ishlatiladiAgar yaratilgandan so’ng, F.prototype xususiyati o’zgarsa (F.prototype = <another object>) bo’lsa, unda new F tomonidan yaratilgan yangi obyektlar [[Prototype]] nomli boshqa obyektga ega bo’ladi, lekin allaqachon mavjud narsalar eskisini saqlab qoladi.
Sukut bo’yicha F.prototype, constructor xususiyat
Har qanday funktsiya "prototype" xususiyatiga ega, hatto biz uni ta’minlamasak ham.
Odatiy "prototype" funktsiyani o’zi ko’rsatadigan yagona constructor xususiyatiga ega bo’lgan obyekt.
Shunga o’xshash:
function Rabbit() {}
/* standart prototip
Rabbit.prototype = { constructor: Rabbit };
*/
Biz buni tekshirib ko’rishimiz mumkin:
Tabiiyki, agar biz hech narsa qilmasak, constructor xususiyati barcha quyonlarga [[Prototype]] orqali mavjud:
Mavjud bilan bir xil konstruktor yordamida yangi obyekt yaratish uchun constructor xususiyatidan foydalanishimiz mumkin.
Buy erda bo’lgani kabi:
Obyektga ega bo’lganimizda, buning uchun qaysi konstruktor ishlatilganligini bilmasak (masalan, u uchinchi tomon kutubxonasidan kelib chiqadi) va biz yana bir xilini yaratishimiz kerak bo’lsa bu juda qulay.
Ehtimol, "constructor" haqida eng muhim narsa shu…
…JavaScript o’zi to’g’ri "constructor" qiymatini ta’minlamaydi.
Ha, bu funktsiyalar uchun standart "prototype" da mavjud, ammo barchasi shu. Keyinchalik u bilan nima sodir bo’ladi – bu butunlay bizdadir.
Xususan, agar biz standart prototipni umuman almashtirsak, unda unda "constructor" bo’lmaydi.
Masalan:
Shunday qilib, to’g’ri "constructor" ni saqlab qolish uchun biz "prototype" ga yozish o’rniga xususiyatlarni qo’shish/o’chirishni tanlashimiz mumkin:
function Rabbit() {}
// Rabbit.prototype-ni to'liq yozib bo'lmaydi
// shunchaki qo'shib qo'ying
Rabbit.prototype.jumps = true;
// standart Rabbit.prototype.constructor saqlanib qoladi
Yoki, muqobil ravishda, constructor xususiyatini qo’lda qayta yarating:
Rabbit.prototype = {
jumps: true,
constructor: Rabbit
};
// endi ham konstruktor to'g'ri, chunki biz uni qo'shdik
Xulosa
Ushbu bobda biz konstruktor funktsiyasi orqali yaratilgan obyektlar uchun [[Prototype]] ni o’rnatish usulini qisqacha bayon qildik. Keyinchalik biz unga tayanadigan yanada rivojlangan dasturlash shablonlarni ko’rib chiqamiz.
Hammasi juda sodda, tushunarli bo’lishi uchun bir nechta eslatma:
F.prototypexususiyati[[Prototype]]bilan bir xil emas.F.prototypeqiladigan yagona narsa:new F()chaqirilganda yangi obyektlarning[[Prototype]]ni o’rnatadi.F.prototypeqiymati obyekt yoki null bo’lishi kerak: boshqa qiymatlar ishlamaydi."prototype"xususiyati faqat konstruktor funktsiyasiga o’rnatilganda vanewbilan chaqirilganda bunday maxsus ta’sirga ega bo’ladi.
Oddiy obyektlarda prototype alohida ahamiyatga ega emas:
let user = {
name: "John",
prototype: "Bla-bla", // hech qanday sehr yo'q
};
Odatiy bo’lib, barcha funktsiyalarda F.prototype = {constructor: F} mavjud, shuning uchun biz obyektning konstruktorini uning "constructor" xususiyatiga kirish orqali olishimiz mumkin.