instanceof operatori obyektning ma’lum bir klassga tegishli yoki yo’qligini tekshirishga imkon beradi. Shuningdek, bu merosni hisobga oladi.
Bunday tekshirish ko’p hollarda zarur bo’lishi mumkin, bu yerda biz polimorfik funktsiyani yaratish uchun foydalanamiz, bu argumentlarni turiga qarab turlicha ko’rib chiqadi.
instanceof operator
Sintaksis:
obj instanceof Class;
Agar obj Class ga (yoki undan meros qolgan klassga) tegishli bo’lsa, true qiymatini qaytaradi.
Masalan:
Shuningdek, u konstruktor funktsiyalari bilan ishlaydi:
…Va Array singari o’rnatilgan klasslar bilan:
Iltimos, arr ham Object klassga tegishli ekanligini unutmang. Buning sababi, Array prototip sifatida Object dan meros qilib oladi.
instanceof operatori tekshirish uchun prototip zanjirini taqdiq qiladi va shuningdek, Symbol.hasInstance statik usuli yordamida aniq sozlanadi.
obj instanceof Class algoritmi taxminan quyidagicha ishlaydi:
-
Agar
Symbol.hasInstancestatik usuli bo’lsa, bundan foydalaning. Shunga o’xshash: -
Ko’pgina klasslarda
Symbol.hasInstancemavjud emas. Bunday holda,Class.prototypeprototip zanjiridagi prototiplardan biriga to’g’ri keladimi-yo’qligini tekshirib ko’ring.Boshqacha qilib aytganda, taqqoslang:
obj.__proto__ === Class.prototype? obj.__proto__.__proto__ === Class.prototype? obj.__proto__.__proto__.__proto__ === Class.prototype? ... // if any answer is true, return true // otherwise, if we reached the end of the chain, return falseYuqoridagi misolda
Rabbit.prototype === rabbit.__proto__, shuning uchun darhol javob beradi.Meros bo’lsa,
rabbit– bu ota-ona klassining namunasi:
Quyida rabbit instanceof Animal ning Animal.prototype bilan taqqoslagani tasvirlangan:
Aytgancha, yana bir usul objA.isPrototypeOf(objB), agar objA prototiplar zanjirining bir joyida bo’lsa, true ni qaytaradi. Shunday qilib, obj instanceof Class sinovi Class.prototype.isPrototypeOf(obj) sifatida qayta ifodalanishi mumkin.
Bu juda kulgili, lekin Class konstruktorining o’zi tekshirishda qatnashmaydi! Faqat prototiplar zanjiri va Class.prototype muhim ahamiyatga ega.
Bu prototype o’zgartirilganda qiziqarli oqibatlarga olib kelishi mumkin.
Bu yerda bo’lgani kabi:
Bu prototype ni o’zgartirmaslikning sabablaridan biridir. Xavfsizlikni saqlash uchun.
Bonus: Object toString turi uchun
Oddiy obyektlar [object Object] massiviga aylantirilishini allaqachon bilamiz:
Bu ularning toString dasturidir. Ammo toString ni aslida undan kuchliroq qiladigan maxfiy xususiyat mavjud. Biz uni kengaytirilgan typeof va instanceof uchun alternativa sifatida ishlatishimiz mumkin.
G’alati tuyuladimi? Haqiqatdan ham. Keling, demistifikatsiya qilaylik.
Spetsifikatsiya bo’yicha o’rnatilgan toString obyektdan olinishi va boshqa har qanday qiymat kontekstida bajarilishi mumkin. Va uning natijasi ushbu qiymatga bog’liq.
- Raqam uchun shunday bo’ladi
[object Number] - Mantiqiy turdagi qiymat uchun bu shunday bo’ladi
[object Boolean] nulluchun:[object Null]undefineduchun:[object Undefined]- Massivlar uchun:
[object Array] - …va hokazo (sozlash mumkin).
Keling, namoyish qilaylik:
Biz bu yerda call bobda Dekorativlar va ekspeditorlik, call/apply tasvirlanganidek, this=arr kontekstida objectToString funktsiyasini bajarish uchun foydalanganmiz.
Ichkarida, toString algoritmi this ni tekshiradi va tegishli natijani beradi. Ko’proq misollar:
Symbol.toStringTag
Obyektning toString xatti-harakatlarini Symbol.toStringTag maxsus obyekt xususiyati yordamida sozlash mumkin.
Masalan:
Aksariyat atrof-muhit obyektlari uchun bunday xususiyat mavjud. Brauzerga xos bir nechta misol:
Ko’rib turganingizdek, natija aynan Symbol.toStringTag (agar mavjud bo’lsa) bo’lib, [object ...] ga o’ralgan.
Oxir-oqibat bizda “typeof steroidlarda” mavjud bo’lib, ular nafaqat ma’lumotlarning ibtidoiy turlari uchun, balki o’rnatilgan obyektlar uchun ham ishlaydi va hatto ularni sozlash mumkin.
Bu turni faqat tekshirish uchun emas, balki matn sifatida olishni xohlaganimizda, o’rnatilgan obyektlar uchun instanceof o’rniga ishlatilishi mumkin.
Xulosa
Keling, biz bilgan turlarni tekshirish usullarini takrorlaymiz:
| uchun ishlaydi | qaytaradi | |
|---|---|---|
typeof |
ibtidoiy narsalar | matn |
{}.toString |
ibtidoiy narsalar, o’rnatilgan obyektlar, Symbol.toStringTag bilan obyektlar |
matn |
instanceof |
obyektlar | true/false |
Ko’rib turganimizdek, {}.toString texnik jihatdan “yanada rivojlangan” typeof dir.
Va instanceof operatori biz klass iyerarxiyasi bilan ishlayotganimizda va merosni hisobga olgan holda klassni tekshirishni xohlaymizda chindan ham porlaydi.