ÙÙ Ø¬Ø§ÙØ§ Ø³ÙØ±Ùبت ÙÙ
ÙÙÙØ§ اÙÙØ±Ø§Ø«Ø© Ù
Ù ÙØ§Ø¦Ù ÙØ§ØØ¯ ÙÙØ·. ÙÙ
Ù٠ا٠ÙÙØ¬Ø¯ [[Prototype]] ÙØ§ØØ¯ ÙÙØ· ÙÙÙØ§Ø¦Ù. Ù ÙÙ
ÙÙ ÙÙÙ class ا٠ÙÙÙÙ
ب٠extend ÙÙØ· Ù
Ù class ÙØ§ØØ¯ آخر.
Ù ÙÙÙ Ù٠بعض Ø§ÙØ£ØÙا٠ذÙÙ ÙÙØÙ Ø¨Ø§ÙØªÙÙÙØ¯. Ù
ثا٠عÙ٠ذÙÙ, ÙØ¯ÙÙØ§ class ÙÙ StreetSweeper Ù class آخر ÙÙ Bicycle, Ù ÙØ±Ùد تÙÙÙ٠ذÙ٠اÙÙ
Ø²ÙØ¬ بÙÙÙÙ
: Ù ÙÙ StreetSweepingBicycle.
Ø£Ù ÙØ¯ÙÙØ§ class ÙÙ User Ù class آخر ÙÙ EventEmitter Ø§ÙØ°Ù ÙÙÙÙ
بتÙÙÙØ° إستخراج Ø§ÙØ£ØØ¯Ø§Ø«, Ù ÙØ±Ùد Ø§ÙØ¢Ù Ø¥Ø¶Ø§ÙØ© Ø¯ÙØ§Ù EventEmitter Ø¥ÙÙ User, ÙÙÙ ÙÙ
ÙÙ Ù
ستخدÙ
ÙÙØ§ Ù
Ù Ø¥Ø±Ø³Ø§Ù Ø§ÙØ£ØØ¯Ø§Ø«.
ÙÙØ¬Ø¯ Ù
ÙÙÙÙ
ÙÙ
ÙÙ Ø£Ù ÙØ³Ø§Ø¹Ø¯Ùا ÙÙØ§, ÙÙØ³ÙÙ
Ù mixins.
ÙÙ
ا ÙØªÙ
تعرÙÙÙ ÙÙ ÙÙÙÙØ¨ÙØ¯ÙØ§, mixin ÙÙ class ÙØØªÙ٠عÙÙ Ø¯ÙØ§Ù ÙÙ
Ù٠إستخداÙ
ÙØ§ Ø¨ÙØ§Ø³Ø·Ø© classes أخر٠بدÙÙ Ø§ÙØØ§Ø¬Ù Ø§Ù٠اÙÙØ±Ø§Ø«Ø© Ù
ÙÙØ§.
بطرÙÙØ© أخرÙ, mixin ÙÙ
ÙÙÙØ§ تÙÙÙØ± Ø¯ÙØ§Ù تÙÙÙ
بتÙÙÙØ° سÙÙÙ Ù
ØØ¯Ø¯, Ù ÙÙÙ ÙØÙ ÙØ§ ÙØ³ØªØ®Ø¯Ù
ÙØ§ ÙØØ¯ÙØ§, ÙØÙ ÙØ³ØªØ®Ø¯Ù
ÙØ§ ÙÙØ¶Ù٠سÙÙ٠اÙÙ classes أخرÙ.
٠ثا٠عÙÙ mixin
أسÙ٠طرÙÙØ© ÙØªÙÙÙØ° mixin ÙÙ Ø¬Ø§ÙØ§ Ø³ÙØ±Ùبت Ù٠ا٠تÙÙÙ
بعÙ
Ù ÙØ§Ø¦Ù ÙÙ Ø¯ÙØ§Ù Ù
ÙÙØ¯Ø©, ÙØ°Ø§ ÙÙ
ÙÙÙØ§ بسÙÙÙØ© دÙ
جÙÙ
Ù
ع prototype خاص بأÙÙ class.
For instance here the mixin sayHiMixin is used to add some âspeechâ for User:
// mixin
let sayHiMixin = {
sayHi() {
alert(`Ù
Ø±ØØ¨Ø§Ù ${this.name}`);
},
sayBye() {
alert(`اÙÙØ¯Ø§Ø¹ ${this.name}`);
}
};
// usage:
class User {
constructor(name) {
this.name = name;
}
}
// ÙØ³Ø® Ø§ÙØ¯ÙاÙ
Object.assign(User.prototype, sayHiMixin);
// Ø§ÙØ¢Ù User ÙÙ
Ù٠ا٠ÙÙÙÙ Ù
Ø±ØØ¨Ø§Ù
new User("Dude").sayHi(); // Ù
Ø±ØØ¨Ø§Ù Dude!
ÙØ§ ÙÙØ¬Ø¯ ÙØ±Ø§Ø«Ø©, Ù ÙÙÙ ÙØ³Ø® Ø¯ÙØ§Ù ببساطة. ÙØ°Ø§ User ربÙ
ا ÙØ±Ø« Ù
Ù class آخر Ù ÙÙÙÙ
بتضÙ
ÙÙ mixin ÙÙÙ âÙÙ
Ø²Ø¬â Ø§ÙØ¯ÙØ§Ù Ø§ÙØ¥Ø¶Ø§ÙÙØ©, Ù
ث٠ذÙÙ:
class User extends Person {
// ...
}
Object.assign(User.prototype, sayHiMixin);
Mixins ÙÙ
ÙÙÙØ§ Ø§ÙØ¥Ø³ØªÙادة Ù
٠اÙÙØ±Ø§Ø«Ø© داخ٠ÙÙØ³Ùا.
Ù
ثا٠عÙ٠ذÙÙ, ÙÙØ§ sayHiMixin ترث Ù
Ù sayMixin:
let sayMixin = {
say(phrase) {
alert(phrase);
}
};
let sayHiMixin = {
__proto__: sayMixin, // (or we could use Object.setPrototypeOf to set the prototype here)
sayHi() {
// Ø·ÙØ¨ تÙÙÙØ° Ø§ÙØ¯Ø§ÙØ© Ø§ÙØ£Ø¨
super.say(`Hello ${this.name}`); // (*)
},
sayBye() {
super.say(`Bye ${this.name}`); // (*)
}
};
class User {
constructor(name) {
this.name = name;
}
}
// ÙØ³Ø® Ø§ÙØ¯ÙاÙ
Object.assign(User.prototype, sayHiMixin);
// Ø§ÙØ¢Ù User ÙÙ
Ù٠أ٠ÙÙÙÙ Ù
Ø±ØØ¨Ø§Ù
new User("Dude").sayHi(); // Ù
Ø±ØØ¨Ø§Ù Dude!
برجاء Ù
ÙØ§ØØ¸Ø© Ø§Ù Ø·ÙØ¨ Ø§ÙØ¯Ø§ÙØ© Ø§ÙØ£Ø¨ super.say() Ù
Ù sayHiMixin (ÙÙ Ø§ÙØ³Ø·Ùر اÙÙ
عÙÙÙ٠ب٠(*)) ØªØ¨ØØ« Ø¹Ù Ø§ÙØ¯Ø§ÙÙ ÙÙ prototype Ø§ÙØ®Ø§Øµ ب٠mixin, ÙÙØ³ Ø§ÙØ®Ø§Øµ ب class.
ÙØ°Ø§ ÙÙ Ø§ÙØ±Ø³Ù Ø§ÙØ¨ÙاÙÙ (Ø£ÙØ¸Ø± اÙÙ Ø§ÙØ¬Ø²Ø¡ Ø§ÙØ£ÙÙ Ù):
ÙØ°Ø§ بسبب Ø§ÙØ¯Ø§ÙØ© sayHi Ù sayBye Ø§ÙØ°Ù تÙ
Ø¥ÙØ´Ø§Ø¤ÙÙ
ا ÙÙ sayHiMixin. ÙØ°Ø§ عÙÙ Ø§ÙØ±ØºÙ
Ù
٠اÙ٠تÙ
ÙØ³Ø®ÙÙ
, [[HomeObject]] Ø§ÙØ®Ø§Øµ بÙÙ
ÙÙ Ù
رجع Ø§ÙØ®Ø§ØµÙØ© Ø§ÙØ¯Ø§Ø®ÙÙØ© sayHiMixin, ÙÙ
ا ÙÙ Ù
ÙØ¶Ø ÙÙ Ø§ÙØµÙرة Ø§Ø¹ÙØ§Ù.
ÙÙ
ا Ø£Ù super ÙØ¨ØØ« Ø¹Ù Ø§ÙØ¯Ø§ÙØ© Ø§ÙØ£Ø¨ ÙÙ [[HomeObject]].[[Prototype]], ÙØ°Ø§ ÙØ¹Ù٠اÙÙ ÙØ¨ØØ« ÙÙ sayHiMixin.[[Prototype]], Ù ÙÙØ³ User.[[Prototype]].
EventMixin
Ø§ÙØ¢Ù Ø¯Ø¹ÙØ§ ÙÙÙÙ
بعÙ
Ù Ù
ثا٠ØÙÙÙÙ ÙÙÙ mixin .
Ù
ÙØ²Ø© Ù
ÙÙ
Ø© ÙÙØ¹Ø¯Ùد Ù
Ù ÙØ§Ø¦Ùات اÙÙ
ØªØµÙØ (Ù
ثاÙ) Ø£ÙÙÙ
ÙÙ
ÙÙÙÙ
استخراج Ø§ØØ¯Ø§Ø«. Ø§ÙØ£ØØ¯Ø§Ø« Ù٠طرÙÙØ© Ø¬ÙØ¯Ø© ÙÙ âÙØ´Ø± اÙÙ
عÙÙÙ
اتâ ÙØ£Ù شخص ÙØ±ÙØ¯ÙØ§. ÙØ°Ø§ Ø¯Ø¹ÙØ§ ÙÙÙÙ
بعÙ
Ù mixin Ø§ÙØ°Ù ÙØ³Ù
Ø ÙÙØ§ ا٠ÙÙÙÙ
بسÙÙÙØ© Ø¨Ø¥Ø¶Ø§ÙØ© Ø¯ÙØ§Ù Ù
تعÙÙÙ Ø¨Ø§ÙØ£ØØ¯Ø§Ø« ÙØ£Ù class/object.
- اÙÙ
mixinسÙÙ ÙÙÙØ± Ø¯Ø§ÙØ©.trigger(name, [...data])ÙÙÙ âÙØ³ØªØ®Ø±Ø¬ Ø§ÙØØ¯Ø«â Ø¹Ùد٠ا ÙØØ¯Ø« Ø´ÙØ¦ Ù ÙÙ ÙÙØ§. Ù ØªØºÙØ± اÙÙnameÙÙ Ø¥Ø³Ù Ø§ÙØØ¯Ø«, Ù ØªØ¨ÙØ¹Ø§Ù بشÙÙ Ø¥Ø®ØªÙØ§Ø±Ù Ø¨Ù Ù ØªØºÙØ±Ø§Øª إضاÙÙØ© Ø¨Ø¨ÙØ§Ùات Ø§ÙØØ¯Ø«. - Ø£ÙØ¶Ø§Ù Ø§ÙØ¯Ø§ÙØ©
.on(name, handler)Ø§ÙØªÙ تضÙÙ Ø¯Ø§ÙØ©handlerØ§ÙØªÙ تÙÙÙ Ø¨Ø§ÙØ¥Ø³ØªÙ اع ÙÙØ£ØØ¯Ø§Ø« اÙÙ ÙØ¹Ø·Ù Ø¥Ø³Ù ÙØ§. سÙÙ ÙØªÙ Ø·ÙØ¨Ùا Ø¹ÙØ¯Ù ا ÙØªÙ تشغÙÙ ØØ¯Ø« ٠ا باÙÙØ¥Ø³ÙاÙÙ ÙØ¹Ø·Ù, Ù Ø§ÙØØµÙ٠عÙ٠اÙÙ ØªØºÙØ±Ø§Øª Ø¹ÙØ¯ Ø·ÙØ¨.trigger. - â¦Ù Ø§ÙØ¯Ø§ÙØ©
.off(name, handler)Ø§ÙØªÙ تÙÙÙ Ø¨Ù Ø³Ø Ø§Ù٠ست٠عhandler.
بعد Ø¥Ø¶Ø§ÙØ© mixin, اÙÙØ§Ø¦Ù user ÙÙ
ÙÙ٠إستخراج ØØ¯Ø« "login" Ø¹ÙØ¯Ù
ا ÙÙÙÙ
Ø§ÙØ²Ø§Ø¦Ø± بتسجÙÙ Ø§ÙØ¯Ø®ÙÙ. Ù ÙØ§Ø¦Ù آخر, ÙÙÙÙ, calendar ربÙ
ا ÙØ±Ùد Ø§ÙØ¥Ø³ØªÙ
اع ÙØ¨Ø¹Ø¶ Ø§ÙØ£ØØ¯Ø§Ø« ÙØªØÙ
Ù٠اÙÙØªÙجة ÙÙØ´Ø®Øµ Ø§ÙØ°Ù ÙØ§Ù
بتسجÙÙ Ø§ÙØ¯Ø®ÙÙ.
Ø£Ù, menu ÙÙ
ÙÙ٠إستخراج Ø§ÙØØ¯Ø« "select" Ø¹ÙØ¯Ù
ا ÙØªÙ
Ø£Ø®ØªÙØ§Ø± Ø¹ÙØµØ± Ù
٠اÙÙØ§Ø¦Ù
Ø©, Ù ÙØ§Ø¦Ùات اخر٠ÙÙ
Ù٠ا٠ترÙÙ handlers ÙÙÙ ØªØªÙØ§Ø¹Ù Ù
ع ÙØ°Ø§ Ø§ÙØØ¯Ø«. Ù ÙØ°ÙÙ.
ÙØ°Ø§ Ù٠اÙÙÙØ¯:
let eventMixin = {
/**
* Ø§ÙØ¥Ø³ØªÙ
اع اÙÙ Ø§ÙØØ¯Ø«, Ø§ÙØ¥Ø³ØªØ®Ø¯Ø§Ù
:
* menu.on('select', function(item) { ... }
*/
on(eventName, handler) {
if (!this._eventHandlers) this._eventHandlers = {};
if (!this._eventHandlers[eventName]) {
this._eventHandlers[eventName] = [];
}
this._eventHandlers[eventName].push(handler);
},
/**
* Ø¥ÙØºØ§Ø¡ اÙÙ
تابعÙ, Ø§ÙØ¥Ø³ØªØ®Ø¯Ø§Ù
:
* menu.off('select', handler)
*/
off(eventName, handler) {
let handlers = this._eventHandlers?.[eventName];
if (!handlers) return;
for (let i = 0; i < handlers.length; i++) {
if (handlers[i] === handler) {
handlers.splice(i--, 1);
}
}
},
/**
* إستخراج ØØ¯Ø« Ø¨Ø§ÙØ¥Ø³Ù
Ù Ø§ÙØ¨ÙØ§ÙØ§Øª اÙÙ
ÙØ¹Ø·Ø§Ù
* this.trigger('select', data1, data2);
*/
trigger(eventName, ...args) {
if (!this._eventHandlers?.[eventName]) {
return; // no handlers for that event name
}
// Ø·ÙØ¨ اÙÙ handlers
this._eventHandlers[eventName].forEach((handler) => handler.apply(this, args));
},
};
.on(eventName, handler)â ØªÙÙ٠بتعÙÙÙ Ø¯Ø§ÙØ©handlerÙØªÙÙÙ Ø¨Ø§ÙØ¹Ù Ù Ø¹ÙØ¯Ù ا ÙØØ¯Ø« ÙØ°Ø§ Ø§ÙØØ¯Ø« بذÙÙ Ø§ÙØ¥Ø³Ù . تÙÙÙØ§Ù, ÙÙØ¬Ø¯ Ø®Ø§ØµÙØ©_eventHandlersØ§ÙØªÙ تÙÙ٠بتخزÙ٠٠صÙÙÙØ© Ù ÙhandlersÙÙÙ Ø¥Ø³Ù ØØ¯Ø«, Ù Ù٠٠جرد تÙÙÙ Ø¨Ø¥Ø¶Ø§ÙØªÙ ÙÙÙØ§Ø¦Ù Ø©..off(eventName, handler)â ØªÙÙÙ Ø¨ØØ°Ù Ø§ÙØ¯Ø§ÙØ© Ù Ù ÙØ§Ø¦Ù Ø© اÙÙhandlers..trigger(eventName, ...args)â ØªØ³ØªØ®Ø±Ø¬ Ø§ÙØØ¯Ø«: ÙØªÙ Ø·ÙØ¨ Ù٠اÙÙhandlersÙ Ù_eventHandlers[eventName], Ø¨ÙØ§Ø¦Ù Ø© ٠٠اÙÙ ØªØºÙØ±Ø§Øª...args.
Ø§ÙØ¥Ø³ØªØ®Ø¯Ø§Ù :
// Ø¥ÙØ´Ø¦ class
class Menu {
choose(value) {
this.trigger("select", value);
}
}
// أض٠mixin Ø¨Ù Ø¯ÙØ§Ù خاصة Ø¨Ø§ÙØØ¯Ø«
Object.assign(Menu.prototype, eventMixin);
let menu = new Menu();
// أض٠handler, ÙÙÙ ÙØªÙ
Ø·ÙØ¨Ùا Ø¹ÙØ¯ Ø§ÙØ¥Ø®ØªÙار:
menu.on("select", value => alert(`اÙÙÙÙ
Ø© اÙÙ
ÙØ®ØªØ§Ø±Ø©: ${value}`));
// تÙÙÙØ° Ø§ÙØØ¯Ø« => اÙÙ handler Ø¨Ø§ÙØ£Ø¹ÙÙ ÙØ¹Ù
Ù Ù ÙÙØ¸Ùر:
// اÙÙÙÙ
Ø© اÙÙ
ÙØ®ØªØ§Ø±Ø©: 123
menu.choose("123");
Ø§ÙØ¢Ù, إذا ÙÙØ§ ÙØ±Ùد ا٠ÙÙØ¯ ÙØªÙØ§Ø¹Ù Ø¹ÙØ¯ Ø§ÙØ¥Ø®ØªÙار Ù
٠اÙÙØ§Ø¦Ù
Ø©, ÙÙ
ÙÙÙØ§ Ø§ÙØ¥Ø³ØªÙ
اع اÙÙ٠ع٠طرÙÙ menu.on(...).
Ù eventMixin mixin Ø¬Ø¹ÙØªÙ Ù
Ù Ø§ÙØ³ÙÙ Ø¥Ø¶Ø§ÙØ© ÙØ°Ø§ Ø§ÙØ³ÙÙÙ ÙÙ classes ÙØ«Ùرة ÙÙ
ا ÙØ±Ùد, دÙÙ Ø§ÙØªØ¯Ø®Ù ÙÙ Ø³ÙØ³ÙØ© اÙÙ
ÙØ±Ø§Ø«.
اÙÙ ÙØ®Øµ
Mixin â ÙÙ Ù
ØµØ·ÙØ عاÙ
خاص Ø¨Ø§ÙØ¨Ø±Ù
جة Ø§ÙØ´ÙØ¦ÙØ© object-oriented programming: اÙÙ class Ø§ÙØ°Ù ÙØØªÙ٠عÙÙ Ø¯ÙØ§Ù ÙÙ classes اخرÙ.
بعض اÙÙØºØ§Øª Ø§ÙØ§Ø®Ø±Ù تسÙ
Ø Ø¨Ø§ÙÙØ±Ø§Ø«Ø© اÙÙ
تعددة. Ø¬Ø§ÙØ§ Ø³ÙØ±Ùبت ÙØ§ تسÙ
Ø Ø¨Ø§ÙÙØ±Ø§Ø«Ø© اÙÙ
تعددة, Ù ÙÙÙ mixins ÙÙ
Ù٠تÙÙÙØ°Ùا ع٠طرÙÙ ÙØ³Ø® Ø§ÙØ¯Ùا٠اÙÙ prototype.
ÙÙ
ÙÙÙØ§ إستخداÙ
mixins ÙØ·Ø±ÙÙØ© ÙØ²Ùادة اÙÙ class ع٠طرÙÙ Ø¥Ø¶Ø§ÙØ© سÙÙÙÙØ§Øª Ù
تعددة, Ù
Ø«Ù ØªÙØ³ÙÙ Ø§ÙØØ¯Ø« Ø§ÙØ°Ù رأÙÙØ§Ù Ø¨Ø§ÙØ£Ø¹ÙÙ.
Mixins ÙÙ
Ù٠ا٠تÙÙÙ ÙÙØ·Ø© تضارب اذا ÙØ§Ù
ÙØ§ ع٠طرÙÙ Ø§ÙØ®Ø·Ø£ باÙÙØªØ§Ø¨Ù ÙÙÙ Ø¯ÙØ§Ù خاصة ب٠class. إذا بشÙ٠عاÙ
ÙØ¬Ø¨ عÙ٠اÙÙ
رء Ø£Ù ÙÙÙØ± Ø¬ÙØ¯Ø§Ù Ù٠طرÙÙØ© تسÙ
ÙØ© Ø§ÙØ¯ÙØ§Ù Ø§ÙØ®Ø§ØµÙ ب٠mixin,ÙØªÙÙÙ Ø¥ØØªÙ
اÙÙØ© ØØ¯ÙØ« Ø§ÙØ£Ø®Ø·Ø§Ø¡.
Ø§ÙØªØ¹ÙÙÙØ§Øª
<code>Ø ÙÙÙÙØ«Ùر Ù Ù Ø§ÙØ³Ø·Ùر استخدÙ<pre>Ø ÙÙØ£Ùثر Ù Ù 10 Ø³Ø·ÙØ± استخد٠(plnkr, JSBin, codepenâ¦)