function.should


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

كنت اتناقش مع اخوى الكبير عن كيفيه اطلاق وظيفه فورا بعد استدعاء وظيفه اخرى ، بدون الحاجه الى التكرار ، اليك مثال بسيط حتى تتضح الصوره :

function open(openMsg){
    alert(openMsg);
}
function close(closeMsg){
    alert(closeMsg);
}

لنفرض انك تريد استدعاء close فورا بعد اطلاق open ، فإن الخيار البسيط فى التالى :

open("welcome");
close("bye");

المثال بسيط طبعا ، لكن الحل غير عملى ، لو تريد استدعاء close بعد open اكثر من مره فإن هذا سيؤدى إلى الكثير من الكود .

open("ِAhlan");
close("Slam");

قمت بالتفكير فى اضافه وظيفه جديده بإسم should للصنف Function تعمل كالتالى :

var oc = open.should(close,["bye"]);
oc("welcome"); // welcomw > bye

function append_text(text){
    var div = document.createElement("div");
    div.innerHTML = text ;
    document.body.appendChild(div);
}

var append = append_text.should(append_text,["appending complete"]);
append("Google"); // Google > appending complete
append("Ajax result"); // Ajax result > appending complete

على غرار ما تعلمناه فى سلسله OOP javascript و كيفيه ادراج currying و partial ، يمكنك ادراج الوظيفه should كالتالى :


Function.prototype.should = function(){
    var fn = this; // the function call .should
    var nextFn = arguments[0]; // the first argument as function
    var args = arguments[1]; // the second argument as array
    return function(){ // the new created function 
        fn.apply(null, Array.prototype.slice.call(arguments));
        nextFn.apply(null, args);
    }
}

اود ان اشير فى الكود السابق فقط الى انى استدعيت fn.apply و nextFn.apply و اعطيت اول عباره فى الحالتين القيمه null لأنى لا أريد تغيير ال context ، فقط اريد تمرير العبارات الى الوظيفه المناسبه ، اود ايضا الإشاره إلى ان  فى انترنت اكسبلورر لا يمكن استدعاء call و apply على الكائنات اتى فى بيئه المتصفح Host objects مثل alert و setTimeout لذلك الامثله التاليه ستعمل فى كل المتصفحات عد انترنت اكسبلورر – ليس محل اهتمامى ، اهتمامى هو AIR – :

var append_alert = append_text.should(alert,["appending complete"]);
append_alert("Google");
var append_delay_alert = append_text.should(setTimeout,[function(){
alert("hi")},2000]);
append_delay_alert("Yahooooooo!");

الأوسمة:

رد واحد to “function.should”

  1. almhajer Says:

    تسلم على الفكرة شكلك ناوي اتوسي ربط بعيد بالدوال يعطيك العافية مشاء الله عليك فيه افكار
    الله بيحفظك

أضف تعليقاً

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

WordPress.com Logo

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

صورة تويتر

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

Facebook photo

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

Google+ photo

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

Connecting to %s


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