Obyektlar: asoslar

Konstruktor, new operatori

Oddiy {...} sintaksisi bitta obyekt yaratishga qulay. Ammo bir-biriga o'xshash ko'plab obyektlarni โ€” masalan, ko'p foydalanuvchi, mahsulot yoki menyu bandini โ€” yaratish kerak bo'lganda, konstruktor funksiyalar va new operatori yordamga keladi.

Konstruktor funksiya

Konstruktor funksiya โ€” texnik jihatdan oddiy funksiya. Ammo uni boshqalardan ajratib turuvchi ikkita kelishuv (konvensiya) bor:

  1. Nomi bosh harf bilan boshlanadi (masalan, User, Car);
  2. U faqat new operatori bilan chaqirilishi kerak.
konstruktor.js
// natija shu yerda chiqadi

Bu yerda User funksiyasini new User("Jasur") ko'rinishida chaqirdik. Natijada tayyor, xossalari to'ldirilgan yangi obyekt qaytdi.

new nima qiladi? (4 qadam)

Funksiya new bilan chaqirilganda quyidagi qadamlar sodir bo'ladi:

  1. Yangi bo'sh obyekt yaratiladi va u this'ga tayinlanadi;
  2. Funksiya tanasi bajariladi. Odatda u this'ni o'zgartiradi, unga yangi xossalar qo'shadi;
  3. this qiymati qaytariladi (return);
  4. Ya'ni this avtomatik return qilinadi โ€” buni o'zimiz yozishimiz shart emas.

Boshqacha aytganda, new User(...) quyidagiga o'xshash ishlaydi:

function User(name) {
  // this = {};  (yashirin tarzda)

  // this'ga xossalar qo'shiladi
  this.name = name;
  this.isAdmin = false;

  // return this;  (yashirin tarzda)
}
Demak new User("Jasur") natijasi shunday obyekt bilan bir xil:
let user = { name: "Jasur", isAdmin: false };
Farqi โ€” konstruktor bilan biz istalgancha new User(...) chaqirib, ko'p obyekt yarata olamiz.

this โ€” hozirgi obyekt

Konstruktor ichida this โ€” hozir yaratilayotgan yangi obyektga ishora qiladi. Unga xossa va metod qo'shamiz:

this-metod.js
// natija shu yerda chiqadi

Har bir new chaqiruvi mustaqil obyekt yaratadi: a va b bir-biridan mutlaqo ajralgan.

return konstruktor ichida

Odatda konstruktorlarda return yozilmaydi โ€” ular this'ni avtomatik qaytaradi. Ammo agar return mavjud bo'lsa, quyidagi qoida amal qiladi:

return.js
// natija shu yerda chiqadi
Argumentlarsiz konstruktorni qavssiz ham chaqirish mumkin: new User = new User(). Ammo qavsni yozish yaxshi uslub hisoblanadi โ€” kod aniqroq bo'ladi.

Konstruktorda metodlar

Konstruktorlar nafaqat xossa, balki butun mantiqni โ€” metodlarni ham o'z ichiga oladi. Bu yagona joyda "o'ramlangan" (encapsulated) obyektlar yaratishga imkon beradi:

metodli.js
// natija shu yerda chiqadi

new.target

Ilg'or va kamdan-kam ishlatiladigan sintaksis new.target funksiya ichida uning new bilan chaqirilgan-chaqirilmaganini tekshirishga imkon beradi:

new-target.js
// natija shu yerda chiqadi
Amaliyotda new.target deyarli kerak emas. Uni ba'zan funksiyani newsiz ham new bilan ham bir xil ishlashiga majburlash uchun ishlatishadi, lekin bu kod o'qilishini murakkablashtiradi.

Xulosa