JavaScript / متوسط: الوحدات والعقود غير المتزامنة / الدرس 12
النماذج الأولية والأصناف وسلوك المستقبل
تتبع البحث عن الخصائص وthis في الكائنات والأصناف. شارك السلوك عمداً واحمِ الثوابت وتجنب تغيير النماذج العامة عرضياً.
في هذه الصفحة
أهداف الدرس
- تتبع الخصائص الذاتية والموروثة.
- شرح استدعاء الطريقة حسب المستقبل.
- استخدام الأصناف والتركيب بثوابت صريحة.
يتبع البحث سلسلة
تبدأ القراءة بالخصائص الذاتية ثم تتبع سلسلة النموذج حتى المطابقة أو النهاية. لذلك تشارك الطريقة دون نسخ دالتها لكل مثيل. لا يعني غياب الخاصية الذاتية undefined فقد يوفرها الموروث. يسأل Object.hasOwn عن الملكية تحديداً. افصل بيانات القاموس من السلوك الموروث خاصة للمفاتيح الخارجية. تجنب تعديل نماذج الأنواع القياسية لإضافة مساعدات التطبيق؛ فهو تعديل عام يفاجئ الشيفرة الأخرى ويعقد الاعتماد.
تنظم الأصناف البناء والسلوك
يوفر الصنف صياغة للبناء وطرقاً قائمة على النموذج مع قواعد إضافية. يثبت المنشئ الحالة الصالحة وتحفظ الطرق الانتقالات. لا تغني الحقول العامة عن الثوابت لأن المستدعي يستطيع تعيينها. تقيد الحقول الخاصة الوصول لكنها تحتاج طرقاً وسياسات خطأ سليمة. يمنع عدد حجز خاص الإسناد الخارجي، وتفحص reserve السعة. لا تكشف مجموعة داخلية متغيرة عبر getter إن كان تجاوز القيود ممنوعاً. لا تلغي الأصناف الهوية والنسخ السطحي.
اختبار الكائن ذي الحالة عبر عملياته العامة
يبدأ المثال بسعة اثنين ويرفض تجاوزها بـfalse. تشتق available الإجابة من الحالة الخاصة بدلاً من عداد ثان قد يتناقض. تعاد قيمة أولية فلا يعدل المستدعي العدد عبرها. يغفل النموذج الصغير الإلغاء والتزامن؛ وتحتاج إضافتهما قواعد جديدة لا افتراض صحة كل عملية بسبب الخصوصية. اختبر حد السعة وتكرار الرفض لعدم تغير الحالة بعد الفشل.
class Seats {
#used = 0;
constructor(capacity) { this.capacity = capacity; }
reserve() {
if (this.#used >= this.capacity) return false;
this.#used++;
return true;
}
get available() { return this.capacity - this.#used; }
}
const seats = new Seats(2);
console.log(seats.reserve(), seats.reserve(), seats.reserve());
console.log(seats.available);
true true false
0
لا تؤثر المحاولة الثالثة. ويلزم في التصميم الفعلي التحقق من capacity وحمايتها إن منع تعديلها خارجياً.
اختيار التركيب حين يوضح الاعتماد
قد تعيد الوراثة استخدام عقد سلوك متماسك، لكن العمق يجبر أحياناً ميزات غير مرتبطة في أصل مشترك. يمرر التركيب سياسة سعر أو منسقاً أو محول تخزين لمنسقها، فيوضح الاستبدال والاختبار دون تعديل النماذج العامة. يجب أن يحفظ الفرع توقعات عمليات الأصل؛ فتغيير النجاح أو الخطأ يكسر الاستبدال رغم تطابق الأسماء. فضّل عمليات مجال صغيرة وراجع العقد قبل الوراثة لتجنب أسطر قليلة فقط.
الأخطاء الشائعة وإصلاحها
قراءة طريقة مستخرجة this غير المعرفة
- لماذا يحدث؟
- فقدان مستقبل الاستدعاء المقصود.
- كيف تصلحه؟
- ربط الطريقة أو تغليف استدعاء مستقبل مقصود.
- كيف تتجنب تكراره؟
- اختبار الطريقة في سياق الاستدعاء الفعلي.
قبول حقول موروثة كبيانات مدخل
- لماذا يحدث؟
- الخلط بين القراءة والتحقق من الخاصية الذاتية.
- كيف تصلحه؟
- التحقق من مخطط مسموح وملكية الخصائص عند الحاجة.
- كيف تتجنب تكراره؟
- اعتبار القواميس الخارجية حداً مستقلاً.
اعتبار الحالة الخاصة ضمان صحة
- لماذا يحدث؟
- استبدال تحقق الانتقال بتقييد الوصول.
- كيف تصلحه؟
- التحقق من البناء وكل عملية مسموحة.
- كيف تتجنب تكراره؟
- اختبار الثوابت عند الحدود وبعد الرفض.
اختبر فهمك
1. لماذا تنجح obj.method() وتفشل f بعد استخراج الطريقة؟
اعرض الحل المشروح
يوفر الأول obj مستقبلاً ولا يفعل الثاني. في الوحدة تكون this غير معرفة للاستدعاء العادي غير المرتبط. استخدم bind أو غلافاً عند قصد المستقبل، وراعِ عمر الكائن الملتقط.
2. كيف يحمي مثال Seats سعة ثابتة؟
اعرض الحل المشروح
تحقق من عدد صحيح آمن غير سالب عند البناء وخزنه خاصاً أو أتحه للقراءة وفق العقد. اختبر البناء الخاطئ ومنع تغيير الثابت بإسناد حقل عام. تكمل الخصوصية التحقق ولا تستبدله.
أهم ما تعلمته
- البحث عن الخصائص ومستقبل الاستدعاء آليتان مختلفتان.
- يدعم التغليف الثوابت عندما تحفظها العمليات.