Mixin class فى الجافاسكربت


السلام عليكم و رحمه الله تعالى و بركاته

هناك وسيله اخرى لإعاده إستخدام الكود بدون إستخدام الوراثه ، لأن هناك بعض الحالات تريد إعاده إستخدام وظيفه بعينها ، لاتريد إعاده إستخدام كل الوظائف و الخصائص من صنف لصنف اخر ، و عليه يمكن إستخدام وظيفه من صنف واحد فى عده اصناف اخرى عن طريق augmentation ، فى الواقع يمكنك عمل صنف يحتوى على وظائف ذات اغراض عامه general purposes methods ثم استخدام ما تريده من هذه الوظائف فى الاصناف الاخرى بدون إستخدام الوراثه و هذا الصنف الذى يحتوى على الوظائف العامه يسمى Mixin class ، انظر إلى ال Mixin class البسط التالى :

var Mixin = function(){};
Mixin.prototype = {
    serialize:function(){
        var output = [];
        for(key in this){
            output.push(key+':'+this[key]);
        }
        return output.join(', ');
    }
}

هذا ال Mixin يحتوى على وظيفه واحده serialize يمكننا استخدامها مع اى صنف اخر بدون إستخدام الوراثه inheritznce ، كما يوضح المثال البسيط التالى :

function User(name,age){
    this.name = name;
    this.age=age;
}
User.prototype = {
    getName:function(){
        return this.name;
    }
}

يمكننا استخدام الوظيفه serialize من الصنف Mixin بدون إستخدام الوراثه عن طريق إضافتها إلى ال User.prototype كما يوضح الكود البسيط التالى :

User.prototype.serialize = Mixin.prototype.serialize;

و يمكننا استخدامها كما يوض الكود البسيط التالى :

var me = new User("Mostafa Farghaly",21);
me.serialze(); // "name:Mostafa Farghaly, age:21, getName: Mostafa Farghaly"

يمكننا عمل وظيفه بإسم augment حتى تسهل علينا اضافه وظائف من اى صنف إلى صنف اخر كما يوضح الكود التالى :

function augment(recievingClass, givingClass){
    for(methodName in givingClass){
        if(! recievingClass.prototype[methodName]){
            recievingClass.prototype[methodName] = givingClass.prototype[methodName];
        }
    }
}

الوظيفه تقوم بإستخدام for … in حتى تنقل اى وظيفه او خاصيه من givingClass.prototype إلى recievingClass.prototype فقط بعد التأكد أنها غير موجوده فى recievingClass.prototype . يمكننا استخدامها كما يوضح المثال البسيط التاى :

augment(User,Mixin);

لكن عيب هذه الوظيفه أنها تنقل كل الخصائص و الوظائف من Mixin إلى User ، ربما فى هذا المثال Mixin لا يحتوى إلا على وظيفه واحده serialize و لكن إذا كان يحتوى على اكثر من وظيفه قد لا نحتاجها ، لذلك يمكننا اعاده كتابه الوظيفه augment حتى تنقل وظائف معينه من Mixin إلى User أو نقل الوظائف كلها ، كما يوضح الكود البسيط التالى :

function augment(recievingClass,givingClass){
    if(argument[2]){ // only give certain methods
        for(var i=2, len=arguments.length; i<len; i+=1){
            var methodName = arguments[i];
            recievingClass.prototype[methodName] = givingClass.prototype[methodName];
        }
    } else { // augment all methods
        for(methodName in recievingClass){
            if(! recievingClass.prototype[methodName]){
                recievingClass.prototype[methodName] = givingClass.prototype[methodName];
            }
        }
    }
}

تم زياده كود لفحص هل يوجد عباره ثالثه ام لا ، و هى التى تمثل الوظيفه التى تريد اضافتها بعينها من Mixin إلى User ، او ربما تكون اكثر من وظيفه و لذلك قمنا بعمل loop بعد العباره التانيه var i=2 و يمكننا استخدام النسخه المعدله من augment كالتالى :

augment(User,Mixin,'serialize');

كما ذكرت اهميه Mixin class عندما يكون هناك صنف عام الاغراض ، لأنه ليس من المنطقى ان يرث User من Mixin ، انما من الطبيعى ان يرث User من Person ، او ان يرث Dog من Animal .

بالطبع يمكنك اضافه الوظيفه augment إلى الصنف Function حتى ترثه كل الوظائف و يستخدم كالتالى :

User.augment(Mixin,'serialize');

الأوسمة: ,

4 تعليقات to “Mixin class فى الجافاسكربت”

  1. almhajer Says:

    يعطيك العافية على المقالة هذه وهذه كمل ذكرت وشددو عليها الاهتمام بالذاكرة وبخاصة كما يستخدمها جاك كيوري بمكتبته صحيح لها فوائد جما بخصوص التعامل وهيل مميزة تضاف الى الجافا سكربت وقوتها شكرا جزيلا وبارك الله فيك

  2. samar Says:

    السلام عليكم و رحمة الله
    أرجو الاستفسار عن مايلي و ارجو ارسال الرد على بريدي الالكتروني بسرعة و لكم الشكر
    بناء الاغراض في جافا سكربيت – الوراثة في جافا سكربيت

  3. حائل Says:

    الله يعطيك العافية اخي مصطفى

أضف تعليقاً

إملأ الحقول أدناه بالمعلومات المناسبة أو إضغط على إحدى الأيقونات لتسجيل الدخول:

WordPress.com Logo

أنت تعلق بإستخدام حساب WordPress.com. تسجيل خروج   / تغيير )

صورة تويتر

أنت تعلق بإستخدام حساب Twitter. تسجيل خروج   / تغيير )

Facebook photo

أنت تعلق بإستخدام حساب Facebook. تسجيل خروج   / تغيير )

Google+ photo

أنت تعلق بإستخدام حساب Google+. تسجيل خروج   / تغيير )

Connecting to %s


%d مدونون معجبون بهذه: