Prototiplar, meros

F.prototype

Yangi obyektlarni new F() ko'rinishidagi konstruktor funksiya orqali yaratishimiz mumkinligini eslaysiz. Agar konstruktor funksiyaning prototype xossasi obyektga teng bo'lsa, new operatori undan yangi obyektlarning [[Prototype]] sini o'rnatish uchun foydalanadi.

Bu yerda ikkita turli tushunchani chalkashtirmang: F.prototype โ€” bu oddiy funksiyaning oddiy xossasi (nomi shunchaki "prototype"). U obyektning yashirin [[Prototype]] xossasi bilan bir xil narsa EMAS, lekin ular o'zaro bog'liq.

F.prototype qanday ishlaydi?

Ideya sodda: agar new F() orqali obyekt yaratilsa va F.prototype obyekt bo'lsa, unda new operatori yangi obyektning [[Prototype]] sini F.prototype ga tenglashtiradi.

fproto-basic.js
// natija shu yerda chiqadi

Bu yerda Rabbit.prototype = animal qatori shuni bildiradi: "new Rabbit orqali yasalgan har bir obyektning prototipi animal bo'lsin". Shuning uchun rabbit.eats zanjir orqali animal obyektidan topiladi.

F.prototype faqat new F() chaqirilgan PAYTDA ishlatiladi. Undan keyin uning qiymatini o'zgartirsangiz, avval yaratilgan obyektlar eski prototipini saqlab qoladi, faqat yangi obyektlar yangisini oladi.

Default F.prototype va constructor

Har bir funksiyada standart (default) prototype xossasi mavjud โ€” biz uni belgilamasak ham. Bu default prototype โ€” faqat bitta constructor xossasidan iborat obyekt bo'lib, constructor funksiyaning o'ziga qaytib ishora qiladi:

fproto-constructor.js
// natija shu yerda chiqadi

Bu constructor xossasi obyektlarga meros orqali o'tadi. Shuning uchun yaratilgan obyektdan ham constructor ga murojaat qilib, uni yaratgan funksiyani topish mumkin:

fproto-obj-constructor.js
// natija shu yerda chiqadi
constructor yordamida mavjud obyekt turini bilmasak ham, xuddi shunday yangi obyekt yaratishimiz mumkin: let rabbit2 = new rabbit.constructor("...");. Bu ba'zan obyektni yasagan funksiya noma'lum bo'lgan holatlarda foydali bo'ladi.

constructor'ni yo'qotib qo'yish xavfi

JavaScript constructor ning to'g'ri qiymatini kafolatlamaydi. Agar biz default prototype ni to'liq yangi obyekt bilan ALMASHTIRSAK, undagi constructor yo'qoladi:

fproto-lost.js
// natija shu yerda chiqadi

Bunday xatoning oldini olishning ikki yo'li bor. Birinchisi โ€” butun obyektni almashtirmasdan, xossalarni birma-bir qo'shish; ikkinchisi โ€” obyektni almashtirganda constructor ni qo'lda tiklab qo'yish:

fproto-fix.js
// natija shu yerda chiqadi
Amalda constructor xossasiga ko'p tayanmaslik ma'qul, chunki uni buzib qo'yish oson. Lekin uning qanday ishlashini bilish, ayniqsa boshqa kishilarning kodini o'qiganda, muhim.

F.prototype โ€” faqat new paytida

Yana bir bor ta'kidlaymiz: F.prototype xossasi obyekt yaratilayotgan aniq bir onda ishlatiladi. Agar keyin F.prototype boshqa obyektga o'zgartirilsa, bu allaqachon mavjud obyektlarga ta'sir qilmaydi:

fproto-timing.js
// natija shu yerda chiqadi

Xulosa