Klasslar

instanceof tekshiruvi

instanceof operatori obyekt ma'lum bir klassga tegishli yoki yo'qligini tekshiradi. U merosni ham hisobga oladi, shuning uchun ko'p hollarda juda foydali.

instanceof operatori

Sintaksis oddiy: obj instanceof Class. Agar obj Classga (yoki undan meros olgan klassga) tegishli bo'lsa, true qaytadi:

instanceof-basic.js
// natija shu yerda chiqadi

Oxirgi misolda arr instanceof Object ham true, chunki Array prototipik jihatdan Objectdan meros oladi.

instanceof meros bilan

instanceofning kuchi shundaki, u prototip zanjiri bo'ylab qaraydi. Ya'ni meros olgan obyekt ham ota klassning "nusxasi" hisoblanadi:

instanceof-inherit.js
// natija shu yerda chiqadi

U qanday ishlaydi? Prototip zanjiri

Aslida obj instanceof Class quyidagi algoritm bo'yicha ishlaydi: u objning prototip zanjirini birma-bir tekshiradi va zanjirda Class.prototype uchraydimi yoki yo'qmi ko'radi.

  1. obj.__proto__ === Class.prototype ? Ha bo'lsa true;
  2. Yo'q bo'lsa, obj.__proto__.__proto__ni tekshiradi;
  3. Zanjir oxirigacha (nullga yetguncha) davom etadi.
instanceof-chain.js
// natija shu yerda chiqadi
Aynan shu sabab instanceof merosni to'g'ri hisobga oladi: u prototip zanjirining istalgan bosqichida Class.prototypeni topsa yetarli.

Symbol.hasInstance

instanceofning xatti-harakatini sozlash mumkin. Agar klassda maxsus statik metod Symbol.hasInstance bo'lsa, instanceof aynan uni chaqiradi:

instanceof-hasinstance.js
// natija shu yerda chiqadi

Bu yerda obj Animaldan meros olmagan bo'lsa ham, uning canEat xossasi true bo'lgani uchun instanceof true qaytardi. Ya'ni biz "tegishlilik" mezonini o'zimiz belgiladik.

Symbol.hasInstance juda kuchli, ammo kamdan-kam ishlatiladi. Uni faqat maxsus mantiq zarur bo'lganda ishlatish tavsiya etiladi, aks holda kod chalkash bo'lib qoladi.

Object.prototype.toString bilan tur aniqlash

typeof operatori cheklangan โ€” u massiv, sana yoki nullni ajrata olmaydi. instanceof esa klasslar bilan ishlaydi. Yana bir kuchli usul โ€” Object.prototype.toString orqali obyektning aniq turini olish:

instanceof-tostring.js
// natija shu yerda chiqadi

Ko'rib turganingizdek, Object.prototype.toString typeofdan aniqroq: u Array, Null kabi turlarni ham to'g'ri aniqlaydi. Faqat qavs ichidagi turni ajratib olish uchun kichik kod yozamiz:

instanceof-gettype.js
// natija shu yerda chiqadi
Object.prototype.toString.call(value).slice(8, -1) โ€” bu "tur aniqlash"ning eng ishonchli usuli. U typeofdan aniqroq va tug'ma turlar bilan mukammal ishlaydi.

Xulosa