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:
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");
}
};
"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:
user.sayHi() chaqirilganda this aynan userga teng bo'ladi. Shuning uchun this.name โ user.name, ya'ni "Jaloliddin".
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:
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:
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.
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:
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.
{ sayHi: () => console.log(this.name) } ishlamaydi, chunki strelka o'z thisiga ega emas โ u obyektni emas, tashqi (global) kontekstni oladi.Xulosa
- Obyekt xossasi qiymati funksiya bo'lsa, u metod deyiladi;
- Metodni
method()yoki qisqartma bilan (method() {...}) yozish mumkin; - Metod ichida
thisโ "joriy obyekt", ya'ni chaqiruvda "nuqtadan oldingi" obyekt; thisqiymati ish vaqtida, funksiya QANDAY chaqirilishiga qarab aniqlanadi;- Obyektsiz chaqirilsa, qat'iy rejimda
this === undefined; - Strelka funksiyalarning o'z
thisi yo'q โ ular tashqithisni oladi; shuning uchun metod sifatida ishlatilmaydi.