محتويات الدورة

JavaScript / متوسط: الوحدات والعقود غير المتزامنة / الدرس 12

النماذج الأولية والأصناف وسلوك المستقبل

تتبع البحث عن الخصائص وthis في الكائنات والأصناف. شارك السلوك عمداً واحمِ الثوابت وتجنب تغيير النماذج العامة عرضياً.

وقت القراءة التقريبي: 4 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • تتبع الخصائص الذاتية والموروثة.
  • شرح استدعاء الطريقة حسب المستقبل.
  • استخدام الأصناف والتركيب بثوابت صريحة.

يتبع البحث سلسلة

تبدأ القراءة بالخصائص الذاتية ثم تتبع سلسلة النموذج حتى المطابقة أو النهاية. لذلك تشارك الطريقة دون نسخ دالتها لكل مثيل. لا يعني غياب الخاصية الذاتية undefined فقد يوفرها الموروث. يسأل Object.hasOwn عن الملكية تحديداً. افصل بيانات القاموس من السلوك الموروث خاصة للمفاتيح الخارجية. تجنب تعديل نماذج الأنواع القياسية لإضافة مساعدات التطبيق؛ فهو تعديل عام يفاجئ الشيفرة الأخرى ويعقد الاعتماد.

تستخدم الطريقة المشتركة مستقبل الاستدعاء

يوفر object.method() الكائن بوصفه this. لا يربط موضع نص الطريقة المستقبل دائماً بالكائن الذي قرئت منه. قد يفقد استخراج الدالة واستدعاؤها مستقلة المستقبل؛ وفي صرامة الوحدة تتلقى الدالة العادية غير المرتبطة undefined. تنشئ bind مستقبلاً ثابتاً، ويلتقط السهم this من محيطه المعجمي. اختر بالقصد عند تمرير طريقة كاستدعاء راجع، ولا تفترض ربط طريقة الصنف نفسها تلقائياً.

javascript سلوك موروث ومستقبل مربوط صراحة
const behavior = { describe() { return this.title; } };
const course = Object.create(behavior);
course.title = "DOM";
console.log(course.describe());
console.log(Object.hasOwn(course, "describe"));
const bound = course.describe.bind(course);
console.log(bound());
الناتج المتوقع
DOM
false
DOM

تُورث describe وتقرأ عنوان المستقبل الذاتي. تحفظ bind المستقبل لاستدعاء مستقل لاحق.

تنظم الأصناف البناء والسلوك

يوفر الصنف صياغة للبناء وطرقاً قائمة على النموذج مع قواعد إضافية. يثبت المنشئ الحالة الصالحة وتحفظ الطرق الانتقالات. لا تغني الحقول العامة عن الثوابت لأن المستدعي يستطيع تعيينها. تقيد الحقول الخاصة الوصول لكنها تحتاج طرقاً وسياسات خطأ سليمة. يمنع عدد حجز خاص الإسناد الخارجي، وتفحص reserve السعة. لا تكشف مجموعة داخلية متغيرة عبر getter إن كان تجاوز القيود ممنوعاً. لا تلغي الأصناف الهوية والنسخ السطحي.

اختبار الكائن ذي الحالة عبر عملياته العامة

يبدأ المثال بسعة اثنين ويرفض تجاوزها بـfalse. تشتق available الإجابة من الحالة الخاصة بدلاً من عداد ثان قد يتناقض. تعاد قيمة أولية فلا يعدل المستدعي العدد عبرها. يغفل النموذج الصغير الإلغاء والتزامن؛ وتحتاج إضافتهما قواعد جديدة لا افتراض صحة كل عملية بسبب الخصوصية. اختبر حد السعة وتكرار الرفض لعدم تغير الحالة بعد الفشل.

javascript عداد خاص محدود
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 سعة ثابتة؟

اعرض الحل المشروح

تحقق من عدد صحيح آمن غير سالب عند البناء وخزنه خاصاً أو أتحه للقراءة وفق العقد. اختبر البناء الخاطئ ومنع تغيير الثابت بإسناد حقل عام. تكمل الخصوصية التحقق ولا تستبدله.

أهم ما تعلمته

  • البحث عن الخصائص ومستقبل الاستدعاء آليتان مختلفتان.
  • يدعم التغليف الثوابت عندما تحفظها العمليات.

المراجع الرسمية