في عملي في التطوير ، غالبًا ما أواجه مواقف أحتاج إلى تحديد ما إذا كانت الوظيفة هي وظيفة جافا سكريبت الأصلية. في بعض الأحيان هذه مهمة ضرورية للغاية. تحتاج إلى معرفة ما إذا كان يتم توفير هذه الوظيفة من قبل المتصفح نفسه ، أو يتم تغليفها وتخفيها كدالة أصلية من قبل طرف ثالث. بالطبع ، أفضل طريقة هي فحص قيمة إرجاع طريقة tostring التي تنفذ هذه الوظيفة.
جافا سكريبت
طريقة إنجاز هذه المهمة بسيطة للغاية:
نسخة الكود كما يلي:
وظيفة isnative (fn) {
return (// {/s*/[code/]/s*/}/). test ('' + fn) ؛
}
ستعود طريقة toString إلى نموذج السلسلة لهذه الطريقة ، ثم استخدم تعبيرًا منتظمًا لتحديد الأحرف الموجودة فيه.
طريقة أقوى
وجد John-David Dalton ، مؤسس Lodash ، حلاً أفضل:
نسخة الكود كما يلي:
؛(وظيفة() {
// تستخدم لحل `[[class]]` من القيم
var tostring = object.prototype.toString ؛
// تستخدم لحل مصدر الوظائف المقلوب
var fntostring = function.prototype.toString ؛
// تستخدم للكشف عن مُنشئات المضيف (Safari> 4 ؛ صفيف مكتوب حقًا)
var rehostctor =/^/[object.+؟ constructor/] $/؛
// تجميع regexp باستخدام طريقة أصلية شائعة كقالب.
// نختار "كائن#toString" لأن هناك فرصة جيدة لأنه لا يتم وضعه مع.
var Renative = regexp ('^' +
// إجبار `كائن#tostring` إلى سلسلة
سلسلة (tostring)
// الهروب من أي شخصيات regexp خاصة
.replace (/[.*+؟^$ {} () | [/] ///]/g ، '// $ &')
// استبدل يذكر "tostring" بـ ".*؟" للحفاظ على القالب عام.
// استبدل شيء مثل `لـ ...` لدعم بيئات مثل Rhino التي تضيف معلومات إضافية
// مثل الطريقة arity.
.replace (/tostring | (وظيفة).*؟ (؟ = /// () | for. +؟ (؟ = ///])/g ، '$ 1.*؟')
) ؛
وظيفة isnative (القيمة) {
var type = typeof value ؛
نوع الإرجاع == "وظيفة"
// استخدم `function#tostring` لتجاوز طريقة "tostring" الخاصة بالقيمة
// وتجنب التزوير.
؟ Renative.test (fntostring.call (القيمة))
// استرجاع للتحقق من كائن مضيف لأن بعض البيئات ستمثل
// أشياء مثل المصفوفات المكتوبة كطرق DOM التي قد لا تتوافق مع
// النمط الأصلي الطبيعي.
: (value && type == 'Object' && rehostctor.test (toString.call (value))) || خطأ شنيع؛
}
// التصدير كما تريد
module.exports = isnative ؛
} ()) ؛
الآن ترى ذلك أيضًا ، إنه معقد للغاية ، لكنه أكثر قوة. بالطبع ، هذا ليس لحماية الأمان ، فهو يوفر لك فقط معلومات ذات صلة حول ما إذا كانت وظيفة أصلية.