Klasslar

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:

mixin-basic.js
// natija shu yerda chiqadi

E'tibor bering: User allaqachon boshqa klassdan meros olishi mumkin, mixin esa unga yana qo'shimcha metodlar beradi. Ya'ni mixin merosga xalaqit bermaydi.

Mixin ichida 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:

mixin-super.js
// natija shu yerda chiqadi

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:

mixin-events.js
// natija shu yerda chiqadi

Bu yerda eventMixin ikkita metod beradi:

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:

Mixin obyektning mavjud metodlarini tasodifan ustidan yozib yuborishi mumkin (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).
Amaliyotda ko'p mashhur kutubxonalar (masalan Node.js'ning EventEmitteri) shunday hodisa mexanizmini beradi. Mixin g'oyasi esa uni istalgan obyektga ulash imkonini beradi.

Xulosa