في هذا الدرس 5تصفّح المواضيع
بخلاف اللغات التقليدية التي تنسخ الدوال داخل كل كائن، تقوم JavaScript في جوهرها على التفويض عبر النماذج الأولية (Prototypes)؛ إذ يمتلك كل كائن رابطاً داخلياً خفياً [[Prototype]] يشير إلى كائن آخر أو إلى null. وعند طلب خاصية غير موجودة في الكائن ذاته يصعد المحرك تلقائياً عبر هذه السلسلة حتى يجدها أو يصل إلى النهاية null.
تمتلك كل دالة بناء تلقائياً كائناً عاماً باسم Constructor.prototype. وعند إنشاء نسخة عبر new User("Nour") يربط المحرك سلالة النسخة مباشرةً بكائن User.prototype؛ وبذلك تُحجز الدوال المضافة إليه مرة واحدة فقط في الذاكرة وتشترك فيها آلاف النسخ بكفاءة قصوى!
إذا عُرّفت داخل نسخة محددة خاصية ذاتية تحمل نفس اسم خاصية موجودة في النموذج الأولي، فإن الخاصية الذاتية تحجب (Shadowing) القيمة الموروثة لتلك النسخة وحدها دون المساس بالنموذج المشترك لبقية النسخ.
| المفهوم | الصياغة القياسية | الدلالة التقنية |
|---|---|---|
| خاصية النموذج على الباني | User.prototype | الكائن المشترك الذي ترث منه جميع نسخ new User() |
| قراءة نموذج النسخة الفعلي | Object.getPrototypeOf(u1) | تسترد الكائن الأب الذي تفوّض إليه النسخة u1 |
| تمييز الذاتي عن الموروث | Object.hasOwn(u1, "badge") | يرجع false للدوال المشتركة وtrue لحقول النسخة |
استخدمت الأكواد القديمة أحياناً الخاصية غير القياسية obj.__proto__ التي أصبحت مهجورة رسمياً؛ اعتمد دائماً الدالة القياسية Object.getPrototypeOf(obj) لقراءة النموذج الأولي بأمان. كما يُنصح بتجنب تغيير السلسلة بعد الإنشاء عبر Object.setPrototypeOf() لأنها تعطل تحسينات السرعة في محركات JIT بالمتصفح.
const arr = [10, 20];
const aProto = Object.getPrototypeOf(arr);
const s1 = aProto === Array.prototype;
const s2 = Object.getPrototypeOf(aProto) === Object.prototype;
const s3 = Object.getPrototypeOf(Object.prototype) === null;
document.getElementById('chain-out').textContent =
`Array.proto: ${s1} -> Object.proto: ${s2} -> null: ${s3}`;
من القواعد الذهبية الصارمة في هندسة JavaScript حظر إضافة دوال مخصصة للنماذج المدمجة مثل Object.prototype أو Array.prototype؛ فإضافة خاصية إلى Object.prototype يسرّبها فوراً لكل كائن وحلقة for...in في التطبيق والمكتبات الخارجية، وقد يتعارض مع تحديثات اللغة المستقبلية، بل ويمثل نفس الأثر التخريبي لثغرات تلوث النموذج الأولي (Prototype Pollution)!
ملخص الدرس
حصاد الدرسمراجعة مركّزة لأهم المفاهيم والقواعد الهندسية التي أتقنتها في هذا الدرس قبل التطبيق العملي
ماذا تعلّمت في هذا الدرس؟
أتقنت في هذا الدرس آلية الوراثة بالنماذج الأولية، ومشاركة الدوال بكفاءة عبر Constructor.prototype، وتتبع سلسلة البحث الصاعدة حتى null، والفحص الآمن عبر Object.getPrototypeOf()، وأسباب حظر تعديل النماذج المدمجة. الخطوة التالية: انتقل إلى درس «الكائنات القابلة للتكرار والمولدات» لبناء مكررات مخصصة ودوال توليد القيم الكسولة.
سجّل الدخول لحفظ تقدمك
تابع إنجاز المواضيع والمصطلحات والمهام، وكمّل من آخر خطوة على أي جهاز.
المصطلحات4
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 01 Prototype Chain سلسلة النماذج الأولية Prototype Chain
- السلسلة المترابطة من الكائنات التي يصعد عبرها المحرك للبحث عن خاصية موروثة حتى يصل إلى null.
- للمراجعة
- 02 Constructor.prototype كائن النموذج المشترك للباني
- الكائن الذي تشترك في وراثة دواله جميع النسخ المنشأة بالمعامل new من دالة البناء.
- للمراجعة
- 03 Object.getPrototypeOf() دالة الفحص Object.getPrototypeOf
- الدالة القياسية الآمنة لقراءة النموذج الأولي الفعلي لأي كائن بديلاً عن الخاصية المهجورة __proto__.
- للمراجعة
- 04 Property Shadowing حجب الخاصية الموروثة Shadowing
- عندما تملك النسخة خاصية ذاتية تحمل نفس اسم خاصية في النموذج الأولي فتحجبها عند القراءة من تلك النسخة.
- للمراجعة
لا توجد بطاقات تطابق البحث والتصفية.
اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.
الاختصارات2
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 01 JIT JIT
- Just-In-Time Compiler
- المترجم الفوري في محرك المتصفح الذي يعتمد في سرعته على ثبات سلسلة النماذج الأولية للكائنات.
- للمراجعة
- 02 TC39 TC39
- Ecma Technical Committee 39
- اللجنة التقنية المسؤولة عن تطوير معايير لغة JavaScript وضمان توافق النماذج المدمجة بالمتصفحات.
- للمراجعة
لا توجد بطاقات تطابق البحث والتصفية.
اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.
مهامك قبل الاختبار
خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.
-
افحص التبويبين الأول والثاني في المحاكي للتأكد من تطابق مرجع الدالة بين النسخ وكونها موروثة.
-
افتح مثال تتبع السلسلة في محرر التجربة وتحقق من ارتباط كائن التاريخ بنموذج Date.prototype.
تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.
اختبر فهمك.
ووصلها للإتقان.
كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.
أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.
الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.