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â¦)