Obyektlar odatda foydalanuvchilar, buyurtmalar va boshqalar kabi real dunyo subyektlarini aks ettirish uchun yaratiladi:
let user = {
name: "John",
age: 30,
};
Va, haqiqiy dunyoda, foydalanuvchi harakat qilishi mumkin: xarid qilish vositasidan biror narsani tanlash, kirish, chiqish va hk.
Amallar JavaScript-da funktsiyadagi xususiyatlar bilan ifodalanadi.
Usul misollari
Boshlash uchun user ga salom aytishni oârgataylik:
let user = {
name: "John",
age: 30
};
user.sayHi = function() {
alert("Salom!");
};
user.sayHi(); // Salom!
Bu yerda biz funktsiyani yaratish va uni obyektning user.sayHi xususiyatiga tayinlash uchun funktsiya ifodasini ishlatdik.
Keyin biz uni chaqira olamiz. Endi âuserâ gaplasha oladi!
Obyektning xususiyati boâlgan funktsiya uning usuli deb nomlanadi.
Shunday qilib, bu yerda bizda user obyektining sayHi usuli bor.
Albatta, biz oldindan eâlon qilingan funktsiyalardan usul sifatida foydalanishimiz mumkin:
let user = {
// ...
};
// birinchi, e'lon qiling
function sayHi() {
alert("Hello!");
};
// keyin usul sifatida qo'shing
user.sayHi = sayHi;
user.sayHi(); // Salom!
Subyektlarni namoyish qilish uchun obyektlar yordamida kodimizni yozganimizda, bu obyektga yoânaltirilgan dasturlash, qisqasi: âOOPâ.
OOP â bu katta narsa, oâziga xos qiziqarli fan. Toâgâri subyektlarni qanday tanlash kerak? Ularning oâzaro taâsirini qanday tashkil qilish kerak? Bu arxitektura va bu mavzu boâyicha E.Gamma, R.Helm, R.Jonson, J.Vissidesning âDizayn naqshlari: qayta ishlatilishi mumkin boâlgan obyektga yoânaltirilgan dasturiy taâminot elementlariâ yoki âObyektga yoânaltirilgan tahlil va dizayn ilovalarâ G.Booch tomonidan yozilgan va boshqalar.
Usulni qisqartirish
Obyektdagi usullar uchun qisqa sintaksis mavjud:
// bu obyektlar ham xuddi shunday qiladi
user = {
sayHi: function() {
alert("Salom");
}
};
// usulni qisqartirish yaxshiroq ko'rinadi, to'g'rimi?
let user = {
sayHi() { // "sayHi: function()" bilan bir xil
alert("Salom");
}
};
Koârsatilganidek, biz "function" ni qoldirib, faqat sayHi() yozishimiz mumkin.
Rostini aytsam, yozuvlar bir-biriga toâliq oâxshash emas. Obyektni meros qilib olish bilan bogâliq nozik farqlar mavjud (keyinroq koârib chiqiladi), ammo hozircha ularning ahamiyati yoâq. Deyarli barcha hollarda qisqa sintaksisga ustunlik beriladi.
âthisâ usullarda
Obyekt usuli oâz ishini bajarish uchun obyektda saqlangan maâlumotlarga kirish huquqiga ega boâlishi odatiy holdir.
Masalan, user.sayHi() ichidagi kodga user nomi kerak boâlishi mumkin.
Obyektga kirish uchun usul this kalit soâzidan foydalanishi mumkin.
this qiymati â bu usulni chaqirish uchun ishlatiladigan ânuqta oldidagiâ obyekt.
Masalan:
let user = {
name: "John",
age: 30,
sayHi() {
// "this" is the "current object"
alert(this.name);
}
};
user.sayHi(); // John
Bu erda user.sayHi() bajarilishi paytida this qiymati user boâladi.
Texnik jihatdan, this kalit soâzisiz obyektga murojaat qilish mumkin, unga tashqi oâzgaruvchan orqali murojaat qilish mumkin.
let user = {
name: "John",
age: 30,
sayHi() {
alert(user.name); // "user" "this" ning o'rniga
}
};
â¦Ammo bunday kod ishonchli emas. Agar biz user ni boshqa oâzgaruvchanga nusxalashga qaror qilsak, masalan, admin = user va user ni boshqa narsa bilan qayta yozsak, shunda u notoâgâri obyektga murojaat qiladi.
Bu quyida koârsatilgan:
let user = {
name: "John",
age: 30,
sayHi() {
alert( user.name ); // xatoga olib keladi
}
};
let admin = user;
user = null; // narsalarni aniq qilib ko'rsatish uchun qayta yozamiz
admin.sayHi(); // Voy! sayHi() ning ichida eski nom ishlatiladi! xato!
Agar biz alert ichida user.name oârniga this.name dan foydalansak, u holda kod ishlaydi.
âthisâ bogâliq emas
JavaScript-da, âthisâ kalit soâz boshqa dasturlash tillarining aksariyatidan farq qiladi. Birinchidan, u har qanday funktsiyada ishlatilishi mumkin.
Bu kabi kodda sintaksis xato yoâq:
function sayHi() {
alert( this.name );
}
this qiymati ish vaqtida baholanadi. Va u har qanday narsa boâlishi mumkin.
Masalan, bir xil funktsiya turli xil obyektlardan chaqirilganda boshqacha âthisâ boâlishi mumkin:
let user = { name: "John" };
let admin = { name: "Admin" };
function sayHi() {
alert( this.name );
}
// ikkita obyektda bir xil funktsiyalardan foydalandik
user.f = sayHi;
admin.f = sayHi;
// chaqiruvlarda boshqacha this
// "this" - bu funktsiyaning ichida "nuqta oldidagi" obyekt
user.f(); // John (this == user)
admin.f(); // Admin (this == admin)
admin['f'](); // Admin (nuqta yoki to'rtburchak qavslar usuliga kirish uchun ishlatiladi - bu muhim emas)
Aslida, biz funktsiyani umuman obyektsiz chaqira olamiz:
function sayHi() {
alert(this);
}
sayHi(); // undefined
Bunday holda this qatâiy rejimda undefined. Agar this.name ga kirishga harakat qilsak, xato boâladi.
Qatâiy boâlmagan rejimda this qiymati global obyekt boâladi (brauzerda window, biz keyinroq Global objekt bobida unga erishamiz. Bunday tarixiy xatti-harakatlarni tuzatish uchun, "use strict" dan foydalaning.
Iltimos, shuni yodda tutingki, odatda this ni obyektsiz ishlatiladigan funktsiya chaqiruvi odatiy emas, aksincha dasturiy xato. Agar funktsiya this ga ega boâlsa, unda odatda obyekt kontekstida chaqirilishi kerak.
thisning oqibatlariAgar ilgari boshqa dasturlash tillarini oârgangan boâlsangiz, unda siz âbogâliqthisâ gâoyasiga oârganib qolgansiz â obyekt ichida aniqlangan usullar har doim oâz obyektiga havolasini saqlaydi.
JavaScript-da this âozodâ, uning qiymati chaqiruv vaqtida baholanadi va usul qayerda eâlon qilinganiga bogâliq emas, balki ânuqta oldidaâ nima boâlganiga bogâliq.
Ish vaqti tushunchasi this ijobiy va salbiy tomonlarga ega. Bir tomondan, funktsiyani turli xil obyektlar uchun qayta ishlatish mumkin. Boshqa tomondan, koâproq moslashuvchanlik xatolar uchun joy ochadi.
Bu yerda bizning pozitsiyamiz ushbu tilni loyihalashtirish boâyicha qarorning yaxshi yoki yomonligini baholash emas. U bilan qanday ishlashni, qanday foyda olish va muammolardan qanday qochish kerakligini organamiz.
Ichki dastur: havola turi
Ushbu boâlim baâzi murakkab vaziyatlarni yaxshiroq tushunish uchun murakkab mavzuni oâz ichiga oladi.
Agar siz tezroq davom etmoqchi boâlsangiz, uni oâtkazib yuborishingiz yoki qoldirishingiz mumkin.
Murakkab usul chaqiruvi this ning qiyamatini yoâqotishi mumkin, masalan:
let user = {
name: "John",
hi() { alert(this.name); },
bye() { alert("Hayir"); }
};
user.hi(); // John (oddiy chaqiruv ishlaydi)
// endi nomiga qarab user.hi yoki user.bye ni chaqiramiz
(user.name == "John" ? user.hi : user.bye)(); // Xato!
Oxirgi satrda user.hi yoki user.bye ni tanlaydigan uchlik operatori mavjud. Bu holda natija user.hi boâladi.
Usul darhol qavslar bilan chaqiriladi (). Ammo bu toâgâri ishlamaydi!
Chaqiruv xatoga olib kelishini koârishingiz mumkin, chunki chaqiruv ichidagi "this" qiymati undefined boâladi.
Bu ishlaydi (obyekt nuqta usuli):
user.hi();
Bu ishlamaydi(baholangan usul):
(user.name == "John" ? user.hi : user.bye)(); // Xato!
Nima uchun? Agar nima uchun bunday boâlishini tushunishni istasak, keling, obj.method() chaqiruvi qanday ishlashini koârib chiqaylik.
Yaqindan qarab, obj.method() ifodasida ikkita operatsiyani koârishimiz mumkin:
- Birinchi nuqta operator
'.'obyektning xususiyatini qaytaradiobj.method. - Keyin qavslar
()uni bajaradi.
Xoâsh, this haqidagi maâlumotlar birinchi qismdan ikkinchisiga qanday yetkaziladi?
Agar biz ushbu operatsiyalarni alohida satrlarga qoâyadigan boâlsak, unda this aniq yoâqoladi:
let user = {
name: "John",
hi() { alert(this.name); }
}
// bo'linish va usulni ikki satrda chaqirish
let hi = user.hi;
hi(); // Xato, chunki this aniqlanmagan
Bu yerda hi = user.hi funktsiyani oâzgaruvchanga qoâyadi, soângra oxirgi satrda u butunlay mustaqil boâladi va shuning uchun this yoqoladi.
user.hi() chaqiruvi ishlash uchun JavaScript-da hiyla ishlatadi â nuqta '.' funktsiyani emas, balki maxsus Reference Type qiymatini qaytaradi.
The Reference Type bu âspetsifikatsiya turiâ dir. Biz uni aniq ishlata olmaymiz, lekin tilning ichida avtomatik ishlatiladi.
Reference Type qiymati uch qiymatli kombinatsiyadir (base, name, strict), bu erda:
basebu obyekt.namebu xususiyat.strictbu true agaruse strictamalda boâsa
user.hi xususiyatiga kirish natijasi funktsiya emas, balki Reference Type qiymatidir. user.hi qatâiy rejimda:
// Reference Type qiymati
user, "hi", true;
Reference Type-da qavslar () chaqirilganligida, ular obyekt va uning usuli haqida toâliq maâlumot olishadi va toâgâri this belgilashlari mumkin (= user shu holatda).
hi = user.hi tayinlash kabi boshqa har qanday operatsiya havola turini umuman bekor qiladi, user.hi (funktsiya) qiymatini oladi va uzatadi. Shunday qilib, keyingi har qanday operatsiya this ni âyoâqotadiâ.
Shunday qilib, natija sifatida, funktsiya toâgâridan-toâgâri obj.method() nuqta yoki kvadrat qavslar obj [' usuli ']() sintaksisidan foydalanilsa (ular bu erda bir xil narsa bajarishadi) boâladi. Keyinchalik ushbu qoâllanmada biz ushbu muammoni hal qilishning turli xil usullarini oârganamiz, masalan func.bind().
Oâq funktsiyalarida âthisâ yoâq
Oâq funktsiyalari maxsus: ularda oâzlarining this yoâq. Agar biz this ni oâq funktsiyasi ichida ishlatsak, uning qiymati tashqi ânormalâ funktsiyadan olinadi.
Masalan, bu yerda arrow() tashqi user.sayHi() usulidan this ni ishlatadi:
let user = {
firstName: "Aziza",
sayHi() {
let arrow = () => alert(this.firstName);
arrow();
},
};
user.sayHi(); // Aziza
Bu oâq funktsiyalarining oâziga xos xususiyati, biz aslida alohida this ga ega boâlishni xohlamasligimiz, aksincha uni tashqi kontekstdan olishimiz foydalidir. Keyinchalik O'q funktsiyalarni takrorlayamiz bobida biz oâq funktsiyalarini chuqurroq kirib boramiz.
Xulosa
- Obyekt xususiyatlarida saqlanadigan funktsiyalar âusullarâ deb nomlanadi.
- Usullar obyektlarga
object.doSomething()kabi âharakat qilishâ imkonini beradi. - Usullar obyektga
thisorqali murojaat qilishi mumkin.
this ning qiymati ish vaqtida aniqlanadi.
- Funktsiya eâlon qilinganda, u
thisdan foydalanishi mumkin, ammo funktsiya chaqirilgunchathisning qiymati boâlmaydi. - Ushbu funktsiyani obyektlar oârtasida nusxalash mumkin.
- âUsulâ sintaksisida funktsiya chaqirilganda:
object.method(), chaqiruv paytidathisning qiymatiobjectdir.
Iltimos, oâq funktsiyalari alohida ekanligini unutmang: ularda this yoâq. Oâq funktsiyaning ichida this ga eâlon qilinsa, uning qiymati tashqarida olinadi.
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â¦)