Obyektlar: asoslar

Obyekt metodlari, this

Obyektlar odatda real dunyodagi mavjudotlarni ifodalaydi: foydalanuvchi, buyurtma, mahsulot va h.k. Real dunyoda foydalanuvchi harakat qila oladi โ€” savatga qo'sha oladi, chiqa oladi, xarid qila oladi. Bunday harakatlar kodda metodlar โ€” obyektga tegishli funksiyalar orqali ifodalanadi.

Metod nima?

Obyekt xossasi qiymat sifatida funksiyaga ega bo'lsa, bu funksiya metod deb ataladi. Keling, userga salomlashadigan metod qo'shamiz:

metod.js
// natija shu yerda chiqadi

Bu yerda biz funksiya yaratib, uni user obyektining sayHi xossasiga tayinladik. So'ng user.sayHi() orqali uni chaqirdik. Endi user gapira oladigan bo'ldi.

Metod qisqartmasi

Obyekt literalida metod yozishning qisqaroq, chiroyliroq usuli bor:

// oddiy yozuv
let user = {
  sayHi: function() {
    console.log("Salom");
  }
};

// qisqartma โ€” bir xil ishlaydi, chiroyliroq
let user = {
  sayHi() {
    console.log("Salom");
  }
};
qisqartma-metod.js
// natija shu yerda chiqadi

"this" kalit so'zi

Metod ko'pincha o'zi tegishli obyektning ma'lumotlariga murojaat qilishi kerak. Masalan, user nomini aytmoqchi bo'lsak. Buning uchun metod ichida this kalit so'zi ishlatiladi.

this qiymati โ€” bu metod chaqirilgan obyektga havola, ya'ni "nuqtadan oldingi" obyekt:

this.js
// natija shu yerda chiqadi

user.sayHi() chaqirilganda this aynan userga teng bo'ladi. Shuning uchun this.name โ€” user.name, ya'ni "Jaloliddin".

Texnik jihatdan thissiz, tashqi o'zgaruvchi orqali ham murojaat qilish mumkin edi (user.name). Ammo bu xavfli: agar userni boshqa o'zgaruvchiga ko'chirsak yoki null qilsak, metod xato beradi. this esa har doim to'g'ri obyektga ishora qiladi.

"this" bog'lanmagan (chaqiruvga bog'liq)

JavaScript'da this boshqa ko'p tillardan farq qiladi: u istalgan funksiyada ishlatilishi mumkin va uning qiymati funksiya qanday chaqirilishiga qarab, ish vaqtida (runtime) aniqlanadi. Bu โ€” "free this" (erkin this) tushunchasi.

Bir metodni ikki xil obyektda chaqirsak, this ham har xil bo'ladi:

this-call.js
// natija shu yerda chiqadi

Ko'ryapsizmi โ€” funksiya bitta, ammo this.name har xil. Chunki this "nuqtadan oldingi" obyektni oladi. user.f()da bu user, admin.f()da esa admin.

Obyektsiz chaqiruv

Agar funksiya obyektsiz, oddiygina chaqirilsa-chi? Bunday holatda qat'iy rejimda ("use strict") this qiymati undefined bo'ladi:

this-yolgiz.js
// natija shu yerda chiqadi

Bunday kodda this.name yozsak, u xato beradi, chunki undefinedning xossasi yo'q. Qat'iy rejimsiz (eski kodda) this global obyektga teng bo'lardi โ€” bu odatda xatolik belgisi.

Metodni obyektsiz chaqirish odatda xatodir. thisdan foydalanadigan funksiyani doim uning obyekti orqali (obj.method()) chaqiring.

Strelka funksiyalarda "this" yo'q

Strelka funksiyalari (=>) maxsus: ularning O'Z thisi yo'q. Strelka funksiyasi ichida this ishlatilsa, u tashqi (o'rab turgan) funksiyadan olinadi. Bu ba'zan juda foydali:

strelka-this.js
// natija shu yerda chiqadi

Bu yerda ichki strelka funksiyaning thisi sayHi metodining thisiga (ya'ni userga) teng. Agar oddiy function() {} ishlatganimizda, ichki funksiya obyektsiz chaqirilib, this undefined bo'lardi.

Aynan shuning uchun obyekt metodi sifatida strelka funksiya YOZMANG: { sayHi: () => console.log(this.name) } ishlamaydi, chunki strelka o'z thisiga ega emas โ€” u obyektni emas, tashqi (global) kontekstni oladi.

Xulosa