Konstruktor funksiyalari va "new" operatori
Oddiy `{...}` sintaksisi yordamida bitta ob'ekt yaratish mumkin. Ammo ko'pincha ko'p o'xshash ob'ektlarni yaratish kerak bo'ladi, masalan, bir nechta foydalanuvchilar yoki menyu elementlari va hokazo.
Konstruktor funksiyalari va "new" operatori
Oddiy {...}
sintaksisi yordamida bitta ob'ekt yaratish mumkin. Ammo ko'pincha ko'p o'xshash ob'ektlarni yaratish kerak bo'ladi, masalan, bir nechta foydalanuvchilar yoki menyu elementlari va hokazo.
Buni konstruktor funksiyalari va "new" operatoridan foydalanib amalga oshirish mumkin.
Konstruktor funksiyasi
Konstruktor funksiyalari texnik jihatdan oddiy funksiyalardir. Biroq, ularga nisbatan ikkita kelishilgan konvensiya mavjud:
- Ularning nomi bosh harf bilan boshlanadi.
- Ular faqat "new" operatori bilan bajarilishi kerak.
Masalan:
Funksiya "new" operatori bilan ishlaganda, quyidagi qadamlarni bajaradi:
- Yangi bo'sh ob'ekt yaratiladi va
this
ga tayinlanadi. - Funksiya tanasi bajariladi. Odatda, bu
this
ga yangi xususiyatlar qo'shadi. this
ning qiymati qaytariladi.
Boshqacha qilib aytganda, new User(...)
quyidagi kabi ish qiladi:
Shunday qilib, let user = new User("Jack")
quyidagiga teng natija beradi:
Agar boshqa foydalanuvchilarni yaratmoqchi bo'lsak, new User("Ann")
, new User("Alice")
kabi chaqirishimiz mumkin. Bu har safar literal ishlatishdan ancha qisqaroq va o'qish osonroq.
Konstruktorlarning asosiy maqsadi - qayta foydalanish mumkin bo'lgan ob'ekt yaratish kodini amalga oshirishdir.
Yana bir bor ta'kidlash joiz - texnik jihatdan har qanday funksiya (arrow funksiyalardan tashqari, chunki ular this
ga ega emas) konstruktor sifatida ishlatilishi mumkin. U "new" bilan ishlatilishi mumkin va yuqoridagi algoritmni bajaradi. "Bosh harf bilan boshlash" - bu funksiya "new" bilan bajarilishi kerakligini aniq qilish uchun umumiy kelishuvdir.
new function() { … }
Agar bitta murakkab ob'ektni yaratishga oid ko'p qatorli kodimiz bo'lsa, uni darhol chaqiriladigan konstruktor funksiyasiga o'rashimiz mumkin:
Bu konstruktorni yana bir bor chaqirib bo'lmaydi, chunki u hech qaerda saqlanmaydi, faqat yaratiladi va chaqiriladi. Shunday qilib, bu usul bitta ob'ektni yaratadigan kodni kapsulyatsiya qilishga qaratilgan, keyinchalik qayta ishlatishsiz.
Konstruktor rejimi testi: new.target
Kengaytirilgan mavzu
Bu bo'limdagi sintaksis kamdan-kam qo'llaniladi, agar hammasini bilishni xohlamasangiz, uni o'tkazib yuboring.
Funksiya ichida, u "new" bilan chaqirilganmi yoki yo'qligini maxsus new.target
xususiyati yordamida tekshirishimiz mumkin.
Oddiy chaqiruvlar uchun bu aniqlanmagan (undefined) va agar "new" bilan chaqirilgan bo'lsa, funksiya bilan teng bo'ladi:
Bu funksiya "new" bilan, "konstruktor rejimida" yoki "oddiy rejimda" chaqirilganmi, buni bilish uchun ishlatilishi mumkin.
Shuningdek, biz "new" va oddiy chaqiruvlar uchun bir xil natija olishimiz mumkin, masalan:
Bu usul ba'zan kutubxonalarda sintaksisni moslashuvchan qilish uchun ishlatiladi. Shunday qilib, odamlar funksiyani "new" bilan yoki "new" siz chaqirishlari mumkin, va u hali ham ishlaydi.
Biroq, bu har joyda ishlatish yaxshi emas, chunki "new" ni qoldirish natijasida nima sodir bo'layotgani kamroq aniq bo'ladi. "New" bilan esa biz hamma narsani bilamiz - yangi ob'ekt yaratilmoqda.
Konstruktorlardan qaytish
Odatda, konstruktorlar return
operatoriga ega emas. Ularning vazifasi - zarur bo'lgan barcha narsalarni this
ga yozish, va bu avtomatik ravishda natija bo'ladi.
Ammo agar return
operatori mavjud bo'lsa, unda qoida oddiy:
- Agar
return
ob'ekt bilan chaqirilsa, unda ob'ektthis
o'rniga qaytariladi. - Agar
return
primitiv bilan chaqirilsa, u e'tiborga olinmaydi.
Boshqacha qilib aytganda, return
ob'ekt bilan ishlatilganda, o'sha ob'ekt qaytariladi, boshqa barcha holatlarda this
qaytariladi.
Masalan, bu yerda return
this
ni qaytarish o'rniga ob'ektni qaytaradi:
Va bu yerda bo'sh return
bilan misol keltirilgan (yoki biz uning o'rniga primitivni joylashtirishimiz mumkin, farqi yo'q):
Odatda, konstruktorlar return
operatoriga ega emas. Bu yerda ob'ektlarni qaytarish bilan bog'liq maxsus xatti-harakatlarni to'liq yoritish uchun keltirilgan.
Qavslarni tashlab ketish
Aytgancha, biz "new" dan so'ng qavslarni tashlab ketishimiz mumkin:
Bu yerda qavslarni tashlab ketish "yaxshi uslub" deb hisoblanmaydi, lekin sintaksis spetsifikatsiya tomonidan ruxsat etilgan.
Konstruktor ichidagi metodlar
Konstruktor funksiyalaridan foydalanib ob'ektlar yaratish juda katta moslashuvchanlikni ta'minlaydi. Konstruktor funksiyasi parametrlarni olishi mumkin, ular ob'ektni qanday yaratishni va unga nima qo'shishni belgilaydi.
Albatta, this
ga faqat xususiyatlar emas, balki metodlarni ham qo'shishimiz mumkin.
Masalan, quyidagi new User(name)
ob'ektni berilgan nom bilan va sayHi
metodini yaratadi:
Murakkab ob'ektlar yaratish uchun, yanada rivojlangan sintaksis - klass
lar mavjud, ularni keyinroq ko'rib chiqamiz.
Xulosa
- Konstruktor funksiyalari yoki qisqacha aytganda, konstruktorlar oddiy funksiyalardir, ammo ular
bosh harf bilan nomlanadi.
- Konstruktor funksiyalari faqat "new" yordamida chaqirilishi kerak. Bunday chaqiruv boshida bo'sh
this
yaratilishini va oxirida to'ldirilganthis
ning qaytarilishini bildiradi. - Konstruktor funksiyalarini bir nechta o'xshash ob'ektlarni yaratish uchun ishlatishimiz mumkin.
JavaScript ko'plab ichki til ob'ektlari uchun konstruktor funksiyalarini taqdim etadi: masalan, sanalar uchun Date
, to'plamlar uchun Set
va boshqalar.
Ob'ektlar, biz qaytib kelamiz!
Bu bobda biz ob'ektlar va konstruktorlar haqida faqat asosiy ma'lumotlarni qamrab oldik. Ular keyingi bo'limlarda ma'lumot turlari va funksiyalarni o'rganish uchun muhimdir.
Bularni o'rganganimizdan so'ng, biz ob'ektlarga qaytamiz va ularni chuqurroq o'rganamiz, xususan Prototiplar
, Meros
va Klasslar
bo'limlarida.