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.
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.
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:
Bu constructor xossasi obyektlarga meros orqali o'tadi. Shuning uchun yaratilgan obyektdan ham constructor ga murojaat qilib, uni yaratgan funksiyani topish mumkin:
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:
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:
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:
Xulosa
F.prototypeโ funksiyaning oddiy xossasi (yashirin[[Prototype]]emas);new F()yangi obyekt yaratganda uning[[Prototype]]siniF.prototypega tenglashtiradi;F.prototypeobyekt bo'lishi kerak, aks holdanewuni e'tiborsiz qoldiradi;- Har bir funksiyaning default
prototypesi{ constructor: F }ko'rinishida bo'ladi; constructorobyektlarga meros orqali o'tadi va ularni yaratgan funksiyaga ishora qiladi;- Default
prototypeni to'liq almashtirsangiz,constructoryo'qoladi โ uni qo'lda tiklang.