أواجه دائمًا مواقف أحتاج فيها إلى التحقق مما إذا كانت الوظيفة هي رمز أصلي-هذا محتوى مهم للغاية في الاختبار الوظيفي: هل الوظيفة التي يدعمها المتصفح المدمج أو محاكاة من خلال مكتبات فئة الطرف الثالث. للكشف عن ذلك ، أسهل طريقة هي بالطبع الحكم على القيمة التي يتم إرجاعها بواسطة طريقة tostring للوظيفة.
رمز JavaScript
من السهل في الواقع تحديد ما إذا كانت الوظيفة أصلية:
// حدد ما إذا كانت وظيفة الوظيفة الأصلية isnative (fn) {// مثال: // Alert.ToString () // "تنبيه الوظيفة () {[الكود الأصلي]}" // '' + fn يستخدم تحويل النوع الضمني لـ JS. return (// {/s*/[code/]/s*/}/). test ('' + fn) ؛ }تحويل الوظيفة إلى تمثيل سلسلة وأداء مطابقة منتظمة ، وهذا هو مبدأ التنفيذ.
نسخة ترقية ، تحديث!
؛ (function () {// احصل على طريقة toString للكائن ، المستخدمة لمعالجة المعالجة الداخلية (الداخلية) للقيمة التي تم تمريرها في المعلمة `[[class]]` var toString = object.prototype.toString ؛ // الحصول على طريقة toString للوظيفة البدائية ، تستخدم للتعامل مع رمز التوسيع الخاص بالوظيفة vntoString = function. المُنشئين (المُنشئين) ، // (Safari> 4 ؛ صفيف محدد حقًا) var rehostctor =/^/[Object. +؟ سلسلة (tostring) // الهروب من جميع الأحرف الخاصة المتعلقة بالتعبيرات العادية (/[.*+؟^$ {} () | [/] ///] عدد المعلمات من الطريقة. .replace (/toString | (function).*؟ (؟ = /// () | for. +؟ (؟ = ///])/g ، '$ 1.*؟ دالة isNative (value) {// judge type of typeof var type = typeof value ؛ إرجاع نوع == 'وظيفة' // استخدم الطريقة الأصلية لـ `function#toString` للاتصال ، // بدلاً من قيمة طريقة` tostring` ، // لتجنب الخداع عن طريق التزوير. ؟ Renative.test (fntostring.call (value)) // إذا لم يكن النوع "وظيفة" ، // تحتاج إلى التحقق من كائن المضيف (كائن المضيف) ، // لأن بعض البيئات (المتصفح) ستتعامل مع المصفوفات المكتوبة كطرق DOM // في هذا الوقت) خطأ شنيع؛ } ؛ // يمكنك تعيين isnative للمتغير/الكائن الذي تريد window.isnative = isNative ؛ } ()) ؛رمز الاختبار:
isnative (isnative) // false isnative (تنبيه) // النافذة الحقيقية.