في البرمجة الموجهة للكائنات ، تدعم العديد من اللغات الدعم الزائد للوظيفة ويمكنها القيام بعمليات مختلفة وفقًا لأرقام وأنواع مختلفة من المعلمات التي تم تمريرها بواسطة الوظيفة. ومع ذلك ، فإن JS لا يدعمها ، لذلك نحن بحاجة إلى القيام ببعض الإجراءات الصغيرة الإضافية.
في سياق تنفيذ دالة JS ، هناك متغير مثير للاهتمام يسمى الوسائط. يقوم بتخزين جميع المعلمات التي تم تمريرها أثناء تنفيذ الوظيفة في شكل صفيف ، حتى لو لم يحدد تعريف الوظيفة الكثير من المعلمات الرسمية. ميزة خاصة أخرى هي أنه بالمقارنة مع نوع الصفيف ، فإن متغير الوسيطات وله سمة طول واحدة فقط. أساليب الصفيف ، مثل Push ، Pop ، وما إلى ذلك ، لا تملكها. إنها مجرد "أبرشية زائفة": لها سمة طول ، ويمكن الوصول إلى الصفيف المخزن من خلال حرف الوصول إلى الصفيف [] ، وهو للقراءة فقط ولا يمكن كتابته.
1. التحميل الزائد للأرقام المختلفة
يجب أن يكون واضحًا جدًا هنا أنه يمكنك فقط استخدام سمة الطول لوظيفة الوسيطات للحكم.
نسخة الكود كما يلي:
<script type = "text/javaScript">
وظيفة Talk (MSG ، Handler) {
var len = ediuments.length ؛
// تنفيذ عند تمرير المعلمة
إذا (len == 1) {
تنبيه ("وظيفة تقول:"+msg) ؛
}
// تنفيذ عند تمرير معلمتين
آخر إذا (len == 2) {
معالج (MSG) ؛
}
}
الحديث ("العرض التوضيحي") ؛
Talk ("Demo" ، Function (W) {Alert ("says says:"+w) ؛}) ؛
</script>
2. التحميل الزائد لأنواع مختلفة من المعلمات
بالنسبة للغة المكتوبة ديناميكيًا مثل JS ، فإن الطبيعة التعسفية للإعلانات المتغيرة تقلل من أهمية أنواع المتغيرات الصارمة في عقول المطورين (PS: استناد أيضًا إلى نظام ECMA ، كما يقدم الأنواع الإلزامية من الإعلانات المتغيرة). العديد من الأخطاء غير المتوقعة ناتجة بالفعل عن التحويل التلقائي لهذا النوع المتغير. في الواقع ، يوفر JS طريقة دقيقة للغاية لاكتشاف أنواع المتغيرات بدقة. أكثرها شيوعًا هي طريقة النوع وسمة المنشئ.
1. Typeof متغير إرجاع نوع متغير
نسخة الكود كما يلي:
temp = "say" ؛ //خيط
درجة الحرارة = 1 ؛ //رقم
درجة الحرارة = غير محددة ؛ // غير محدد
temp = null ؛ //هدف
temp = {} ؛ //هدف
temp = [] ؛ //هدف
temp = صحيح ؛ // منطقية
temp = function () {} // function
تنبيه (typeof temp) ؛
من خلال الاختبار أعلاه ، يمكنك أن ترى أنه من أجل NULL والكائن والمصفوفة ، يمكن لجميع أنواع الكائنات الإرجاع ، واستخدام الطريقة التالية حل هذه المشكلة.
2. سمة البناء تكتشف نوع المتغير
يحتوي كل كائن في JS على سمة مُنشئ ، يتم استخدامه للرجوع إلى الوظيفة التي تبني هذا الكائن. من خلال الحكم على هذا المرجع ، يمكن اكتشاف أنواع متغيرة.
نسخة الكود كما يلي:
temp = "say" ؛
temp.constructor == String ؛ //حقيقي
temp = {} ؛
temp.constructor == object ؛ // true
temp = [] ؛
temp.constructor == صفيف ؛ // صحيح
من خلال الاختبار أعلاه ، من السهل التمييز بين متغيرات نوع الصفيف ونوع الكائن. دعنا نختبر الكائن المخصص لمعرفة ما يحدث.
نسخة الكود كما يلي:
// كائن مخصص
Function Ball () {}
// instantiate كائن
var basketball = new ball () ؛
كرة السلة. //حقيقي
يمكن أن يشير هذا إلى أن سمة المنشئ قابلة للتطبيق أيضًا على الكائنات المخصصة.
بعد فهم تطبيق الطريقتين أعلاه ، دعنا نعود إلى محاكاة وظيفة JS الزائدة. المثال التالي هو التحميل الزائد وفقًا لنوع المعلمة.
نسخة الكود كما يلي:
وظيفة Talk (msg) {
var t = typeof msg ؛
if (t == "سلسلة") {
تنبيه ("إنها سلسلة") ؛
}
آخر إذا (t == "رقم") {
تنبيه ("إنه رقم") ؛
}
}
الحديث (10) ؛ // إنها سلسلة
الحديث ("العرض التوضيحي") ؛ // إنه رقم
المرفقة هي وظيفة ذكية للغاية تكتشف بدقة أنواع وأرقام المعلمات:
نسخة الكود كما يلي:
// تحقق بدقة من نوع القائمة المتغيرة بناءً على قائمة المعلمات
وظيفة صارمة (الأنواع ، args) {
// تأكد من تطابق الرقم ونوع نواة المعلمات
if (types.length! = args.length) {
// إذا لم يتطابق الطول ، فسيتم طرح استثناء
رمي "عدد غير صالح من الوسائط. متوقعة" + أنواع.
}
// السفر عبر كل معلمة وتحقق من النوع الأساسي
لـ (var i = 0 ؛ i <args.length ؛ i ++) {
// إذا لم يتطابق نوع معين من JavaScript ، فسيتم طرح استثناء
إذا (args [i] .constructor! = أنواع [i]) {
رمي "نوع الوسيطة غير صالحة. متوقع" + أنواع [i] .name + "، تم استلامها" + args [i] .constructor.name + "بدلاً من ذلك." ؛
}
}
}
// استخدام الطريقة أعلاه
دالة dofunction (معرف ، الاسم) {
// اكتشف رقم ونوع المعلمات
صارمة ([الرقم ، سلسلة] ، وسيطات) ؛
..
}