Mixinlar
JavaScript'da faqat bitta obyektdan meros olish mumkin (bir [[Prototype]] va bir ota klass). Ammo ba'zan bir nechta manbadan funksionallik olishni istaymiz. Bu holda mixin yordamga keladi.
Mixin g'oyasi
Mixin โ bu boshqa klasslar ishlatishi mumkin bo'lgan metodlar to'plamini o'z ichiga olgan klass yoki obyekt. Mixinning o'zi mustaqil ishlatilmaydi โ u boshqa klasslarni "boyitish" uchun xizmat qiladi.
Wikipediadagi ta'rif: mixin โ bu boshqa klasslar tomonidan meros orqali emas, balki metodlarini nusxalash orqali ishlatiladigan metodlarni o'z ichiga olgan klass.
Object.assign bilan eng oddiy mixin
Amalda mixin โ bu shunchaki foydali metodlar to'plamiga ega obyekt. Uni klass prototipiga Object.assign orqali nusxalash mumkin:
E'tibor bering: User allaqachon boshqa klassdan meros olishi mumkin, mixin esa unga yana qo'shimcha metodlar beradi. Ya'ni mixin merosga xalaqit bermaydi.
this ishlatilyapti (masalan this.name). Bu shundan โ mixin metodlari qaysi obyektda chaqirilsa, o'sha obyektning kontekstida ishlaydi.Mixin ichida meros
Mixinlarning o'zi bir-biridan meros olishi ham mumkin. Masalan, bir mixin boshqasidan olingan metodni super orqali chaqirishi mumkin:
Hodisali mixin (EventEmitter)
Mixinning eng amaliy misoli โ hodisalar (events) mixini. Ko'p obyektlar hodisa "chiqarishi" (generatsiya qilishi) va boshqalar ularga "quloq solishi" (tinglashi) kerak bo'ladi. Buni mixin sifatida yozib, istalgan klassga ulash mumkin:
Bu yerda eventMixin ikkita metod beradi:
on(eventName, handler)โ nomli hodisaga tinglovchi (handler) qo'shadi;trigger(eventName, ...args)โ hodisani "chiqaradi", barcha tinglovchilarni chaqiradi.
Endi istalgan klass shu mixinni ulab, hodisalar tizimiga ega bo'la oladi โ yangi meros zanjiri yaratmasdan.
Mixin va meros farqi
Mixin va meros o'rtasidagi asosiy farqlarni tushunish muhim:
- Meros โ "bir turdan" chuqur bog'lanish (
is-a, ya'ni "quyon โ bu hayvon"). JavaScript'da faqat bitta ota klass mumkin; - Mixin โ "funksionallik qo'shish" (
has-a, ya'ni "menyu hodisa chiqara oladi"). Bir nechta mixinni istalgancha ulash mumkin; - Meros prototip zanjiri orqali dinamik bog'lanadi, mixin esa metodlarni nusxalaydi.
Object.assign nusxalagani uchun). Shu sababli mixin metodlariga o'ziga xos, kamdan-kam to'qnashadigan nomlar berish yaxshi amaliyot (masalan _handlers kabi _li ichki nomlar).EventEmitteri) shunday hodisa mexanizmini beradi. Mixin g'oyasi esa uni istalgan obyektga ulash imkonini beradi.Xulosa
- Mixin โ boshqa klasslarga metodlar qo'shish uchun umumiy metodlar to'plami;
- JavaScript'da mixinlar ko'pincha
Object.assign(Class.prototype, mixin)orqali qo'llaniladi; - Mixinlar meros zanjiriga xalaqit bermaydi โ klass baribir boshqa klassdan meros olishi mumkin;
- Hodisali mixin (
on/trigger) โ eng amaliy va keng tarqalgan misol; - Meros "is-a" (bir turdan), mixin esa "has-a" (funksionallik qo'shish) munosabatini ifodalaydi.