Oddiy {...} sintaksisi bitta obyektni yaratishga imkon beradi. Ammo koâpincha biz shunga oâxshash koâplab obyektlarni yaratishimiz kerak, masalan, bir nechta foydalanuvchi yoki menyu elementlari va boshqalar.
Buni konstruktor funktsiyalari va "new" operator yordamida amalga oshirish mumkin.
Konstruktor funktsiyalari
Konstruktor funktsiyalari texnik jihatdan muntazam funktsiyalardir. Ammo ikkita shart mavjud:
- Ular birinchi boâlib katta harf bilan nomlangan.
- Ular faqat
"new"operatori bilan bajarilishi kerak.
Masalan:
function User(name) {
this.name = name;
this.isAdmin = false;
}
let user = new User("Elbek");
alert(user.name); // Elbek
alert(user.isAdmin); // false
Agar funktsiya new User(...) sifatida bajarilsa, u quyidagi amallarni bajaradi:
- Yangi boâsh obyekt yaratilib,
thisga tayinlangan. - Funktsiya tanasi bajariladi. Odatda u
thisni oâzgartiradi, unga yangi xususiyatlar qoâshadi. thisning qiymati qaytariladi.
Boshqacha qilib aytganda, new User(...) quyidagicha ishlaydi:
function User(name) {
// this = {}; (bevosita)
// bunga xususiyatlarni qo'shish
this.name = name;
this.isAdmin = false;
// return this; (bevosita)
}
Shunday qilib, new User("Elbek") ning natijasi quyidagicha:
let user = {
name: "Elbek",
isAdmin: false,
};
Endi biz boshqa foydalanuvchilarni yaratmoqchi boâlsak, new User("Oybek"), new User("Aziza") va boshqalarni chaqirishimiz mumkin. Har safar literallardan foydalanishdan ancha qisqa, shuningdek oâqish oson.
Bu konstruktorlarning asosiy maqsadi â qayta foydalanish mumkin boâlgan obyekt yaratish kodini amalga oshirish.
Yana bir bor taâkidlab oâtamiz â texnik jihatdan har qanday funktsiyani konstruktor sifatida ishlatish mumkin. Yaâni: har qanday funktsiyani new bilan ishlatish mumkin va u yuqoridagi algoritmni bajaradi. âBirinchi boâlib katta harfâ funktsiya new bilan bajarilishini tushuntirish uchun umumiy kelishuvdir.
Agar bitta murakkab koâplab satrli obyekt yaratish kerak boâlsa, ularni quyidagi kabi konstruktor funktsiyasiga oârashimiz mumkin:
let user = new function() {
this.name = "Elbek";
this.isAdmin = false;
// ...foydalanuvchi yaratish uchun boshqa kod
// balki murakkab mantiq va ifodalar
// ichki o'zgaruvchanlar va boshqalar
};
Konstruktorni qayta chaqirish mumkin emas, chunki u hech qaerda saqlanmaydi, shunchaki yaratiladi va chaqiriladi. Shunday qilib, bu hiyla-nayrang kelajakda qayta ishlatmasdan bitta obyektni tuzadigan kodni qamrab olishga qaratilgan.
Ikki sintaksisli konstruktorlar: new.target
Ushbu boâlimdagi sintaksis juda kam ishlatiladi, agar hamma narsani bilmoqchi boâlmasangiz, uni oâtkazib yuboring.
Funktsiyaning ichida biz uni new bilan yoki yoâq holda, new.target maxsus xususiyati yordamida tekshirishimiz mumkin.
Oddiy chaqiruvlar uchun boâsh va agar new bilan chaqirilsa, funktsiyaga teng:
function User() {
alert(new.target);
}
// "new" siz:
User(); // undefined
// "new" bilan:
new User(); // function User { ... }
Buning yordamida new va oddiy chaqiruvlar bir xil ishlashiga imkon berish uchun foydalanish mumkin. Yaâni, xuddi shu obyektni yarating:
function User(name) {
if (!new.target) {
// agar siz meni new siz bajarsangiz
return new User(name); // ...Men siz uchun new ni qo'shaman
}
this.name = name;
}
let john = User("Elbek"); // new User ga yo'naltiradi
alert(john.name); // Elbek
Ushbu yondashuv baâzan sintaksisni yanada moslashuvchan qilish uchun kutubxonalarda qoâllaniladi. Shunday qilib, odamlar funktsiyani new yoki oddiy chaqirishlari mumkin va u hali ham ishlaydi.
Ehtimol, hamma joyda foydalanish yaxshi narsa emas, chunki new ni tashlab qoâyish nima sodir boâlayotganini chunish uchun biroz qiyinroq. new bilan hammamiz bilamizki, yangi obyekt yaratilmoqda.
Konstruktorlardan qiymatni qaytarish
Odatda, konstruktorlarda return ifodasi mavjud emas. Ularning vazifasi barcha kerakli narsalarni this ga yozishdir va bu avtomatik ravishda natijaga aylanadi.
Agar return ifodasi boâlsa, unda qoida oddiy:
- Agar
returnobyekt bilan chaqirilsa, uthisoârniga qaytariladi. - Agar
returnibtidoiy bilan chaqirilsa, unga eâtibor berilmaydi.
Boshqacha qilib aytganda, obyekt bilan return ushbu obyektni qaytaradi, qolgan barcha hollarda this qaytariladi.
Masalan, return orqali obyektni qaytarish bu yerda this ni bekor qiladi:
function BigUser() {
this.name = "Elbek";
return { name: "Godzilla" }; // <-- obyektni qaytaradi
}
alert(new BigUser().name); // Godzilla, bu obyektni oldi ^^
Va bu yerda boâsh return bilan bir misol (yoki biz undan keyin ibtidoiylarni qoâyishimiz mumkin, muhim emas):
function SmallUser() {
this.name = "Elbek";
return; // bajarilishini tugatadi, this ni qaytaradi
// ...
}
alert(new SmallUser().name); // Elbek
Odatda konstruktorlarda return ifodasi mavjud emas. Ushbu blokda tilni oârganishdagi boâshliqlarni qoldirmaslik uchun obyektni qaytarish bilan bogâliq alohida xatti-harakatlar haqida soâz yuritdik.
Aytgancha, agar bizda argument boâlmasa, qavslarni new dan keyin olib tashlashimiz mumkin:
let user = new User; // <-- qavslar yo'q
// bir xil
let user = new User();
Bu yerda qavslarni tashlab qoâyish âyaxshi uslubâ deb hisoblanmaydi, ammo sintaksisda spetsifikatsiya boâyicha ruxsat beriladi.
Konstruktorda usullar
Obyektlarni yaratish uchun konstruktor funktsiyalaridan foydalanish katta moslashuvchanlikni beradi. Konstruktor funktsiyasi obyektni qanday qurish va unga nimani kiritish kerakligini belgilaydigan parametrlarga ega boâlishi mumkin.
Albatta, biz this ga nafaqat xususiyatlarni, balki usullarni ham qoâshishimiz mumkin.
Masalan, quyida new User(name) berilgan name va sayHi usuli bilan obyekt yaratadi:
function User(name) {
this.name = name;
this.sayHi = function() {
alert( "Mening ismim: " + this.name );
};
}
let john = new User("Oybek");
john.sayHi(); // Mening ismim: Oybek
/*
john = {
name: "Oybek",
sayHi: function() { ... }
}
*/
Xulosa
- Konstruktor funktsiyalari yoki qisqacha konstruktorlar muntazam funktsiyalardir, ammo ularni birinchi boâlib katta harf bilan nomlash boâyicha umumiy kelishuv mavjud.
- Konstruktor funktsiyalari faqat
newyordamida chaqirilishi kerak. Bunday chaqiruv boshida boâshthisni yaratishni va oxirida toâliqni qaytarish nazarda tutadi.
Biz bir nechta oâxshash obyektlarni yaratish uchun konstruktor funktsiyalaridan foydalanishimiz mumkin.
JavaScript koâplab oârnatilgan til obyektlari uchun konstruktor funktsiyalarini taqdim etadi: sanalar uchun Data, toâplamlar uchun Set va biz oârganishni rejalashtirgan boshqa narsalar.
Ushbu bobda biz faqat obyektlar va konstruktorlar haqida asoslarni koârib chiqdik. Ular keyingi boblarda maâlumotlar turlari va funktsiyalari haqida koâproq bilish uchun juda muhimdir.
Buni bilib olganimizdan soâng, biz obyektlarga qaytamiz va ularni Prototiplar, meros va Klass: asosiy sintaksis boblarida chuqur yoritamiz.
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â¦)