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:
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 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:
function Rabbit() {}
// by default:
// Rabbit.prototype = { constructor: Rabbit }
alert(Rabbit.prototype.constructor == Rabbit); // true
Tabiiyki, agar biz hech narsa qilmasak, constructor xususiyati barcha quyonlarga [[Prototype]] orqali mavjud:
function Rabbit() {}
// by default:
// Rabbit.prototype = { constructor: Rabbit }
let rabbit = new Rabbit(); // {constructor: Rabbit} dan meros
alert(rabbit.constructor == Rabbit); // true (prototipdan)
Mavjud bilan bir xil konstruktor yordamida yangi obyekt yaratish uchun constructor xususiyatidan foydalanishimiz mumkin.
Buy erda bo’lgani kabi:
function Rabbit(name) {
this.name = name;
alert(name);
}
let rabbit = new Rabbit("White Rabbit");
let rabbit2 = new rabbit.constructor("Black Rabbit");
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:
function Rabbit() {}
Rabbit.prototype = {
jumps: true
};
let rabbit = new Rabbit();
alert(rabbit.constructor === Rabbit); // false
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.
Izohlar
<code>yorlig'ini ishlating, bir nechta satrlar uchun - ularni<pre>yorlig'i bilan o'rab qo'ying, 10 satrdan ortiq bo'lsa - sandbox (plnkr, jsbin, codepen…)