انتقل إلى محتوى الدرس
الدرس 108
تاريخ النشر: تاريخ التحديث:
دورة جافا سكريبت

النماذج الأولية وسلسلة الوراثة PrototypesJavaScript Object Prototypes طريقة تتبع سلسلة البحث الصاعدة، والوراثة بالنماذج الأولية Prototypes، ومشاركة الدوال عبر prototype

أتقن النماذج الأولية وسلسلة الوراثة Prototypes في JavaScript لمشاركة الدوال بكفاءة وتتبع البحث الصاعد والفحص الآمن عبر Object.getPrototypeOf وحماية النماذج المدمجة.
أقسام الدرس
5
الأمثلة
2
اللغة
العربية
المشاهدات
2,879
محتوى الدرس
في هذا الدرس 5تصفّح المواضيع

بخلاف اللغات التقليدية التي تنسخ الدوال داخل كل كائن، تقوم JavaScript في جوهرها على التفويض عبر النماذج الأولية (Prototypes)؛ إذ يمتلك كل كائن رابطاً داخلياً خفياً [[Prototype]] يشير إلى كائن آخر أو إلى null. وعند طلب خاصية غير موجودة في الكائن ذاته يصعد المحرك تلقائياً عبر هذه السلسلة حتى يجدها أو يصل إلى النهاية null.

مخطط سلسلة البحث في النماذج الأولية من النسخة الذاتية إلى User.prototype ثم Object.prototype ثم null

تمتلك كل دالة بناء تلقائياً كائناً عاماً باسم Constructor.prototype. وعند إنشاء نسخة عبر new User("Nour") يربط المحرك سلالة النسخة مباشرةً بكائن User.prototype؛ وبذلك تُحجز الدوال المضافة إليه مرة واحدة فقط في الذاكرة وتشترك فيها آلاف النسخ بكفاءة قصوى!

JavaScript
function Member(handle) {
  this.handle = handle;
}
Member.prototype.badge = function () {
  return `@${this.handle}`;
};
const m1 = new Member('sami');
const m2 = new Member('reem');
const sameFn = m1.badge === m2.badge;
document.getElementById('proto-share').textContent =
  `${m1.badge()} & ${m2.badge()} | Shared fn: ${sameFn}`;

إذا عُرّفت داخل نسخة محددة خاصية ذاتية تحمل نفس اسم خاصية موجودة في النموذج الأولي، فإن الخاصية الذاتية تحجب (Shadowing) القيمة الموروثة لتلك النسخة وحدها دون المساس بالنموذج المشترك لبقية النسخ.

المفهومالصياغة القياسيةالدلالة التقنية
خاصية النموذج على البانيUser.prototypeالكائن المشترك الذي ترث منه جميع نسخ new User()
قراءة نموذج النسخة الفعليObject.getPrototypeOf(u1)تسترد الكائن الأب الذي تفوّض إليه النسخة u1
تمييز الذاتي عن الموروثObject.hasOwn(u1, "badge")يرجع false للدوال المشتركة وtrue لحقول النسخة

استخدمت الأكواد القديمة أحياناً الخاصية غير القياسية obj.__proto__ التي أصبحت مهجورة رسمياً؛ اعتمد دائماً الدالة القياسية Object.getPrototypeOf(obj) لقراءة النموذج الأولي بأمان. كما يُنصح بتجنب تغيير السلسلة بعد الإنشاء عبر Object.setPrototypeOf() لأنها تعطل تحسينات السرعة في محركات JIT بالمتصفح.

JavaScript
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

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 4 مفهومةأول بطاقة، أول خطوة
01 Prototype Chain سلسلة النماذج الأولية Prototype Chain
السلسلة المترابطة من الكائنات التي يصعد عبرها المحرك للبحث عن خاصية موروثة حتى يصل إلى null.
للمراجعة
02 Constructor.prototype كائن النموذج المشترك للباني
الكائن الذي تشترك في وراثة دواله جميع النسخ المنشأة بالمعامل new من دالة البناء.
للمراجعة
03 Object.getPrototypeOf() دالة الفحص Object.getPrototypeOf
الدالة القياسية الآمنة لقراءة النموذج الأولي الفعلي لأي كائن بديلاً عن الخاصية المهجورة __proto__.
للمراجعة
04 Property Shadowing حجب الخاصية الموروثة Shadowing
عندما تملك النسخة خاصية ذاتية تحمل نفس اسم خاصية في النموذج الأولي فتحجبها عند القراءة من تلك النسخة.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

حروف قليلة. معنى كامل.

الاختصارات2

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 2 مفهومةأول بطاقة، أول خطوة
01 JIT JIT
Just-In-Time Compiler
المترجم الفوري في محرك المتصفح الذي يعتمد في سرعته على ثبات سلسلة النماذج الأولية للكائنات.
للمراجعة
02 TC39 TC39
Ecma Technical Committee 39
اللجنة التقنية المسؤولة عن تطوير معايير لغة JavaScript وضمان توافق النماذج المدمجة بالمتصفحات.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

من الفهم للتطبيق

مهامك قبل الاختبار

خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.

0/2مهام منجزة
  1. افحص التبويبين الأول والثاني في المحاكي للتأكد من تطابق مرجع الدالة بين النسخ وكونها موروثة.

  2. افتح مثال تتبع السلسلة في محرر التجربة وتحقق من ارتباط كائن التاريخ بنموذج Date.prototype.

تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.

مساحة التحدي

اختبر فهمك.
ووصلها للإتقان.

كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.

10أسئلة 2أنواع تحديات 100%هدف الإتقان
تصحيح تلقائي. فرص بلا حدود.

أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.

الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.

لمحة عن التحدي10 أسئلة تنتظرك
01

ما القيمة الموجودة في قمة ونهاية سلسلة النماذج الأولية فوق Object.prototype مباشرةً؟

02

ما الدالة القياسية المعتمدة لقراءة النموذج الأولي للكائن بدلاً من الخاصية المهجورة __proto__؟

03

إذا عُرّفت الدالة greet على User.prototype فإن المقارنة u1.greet === u2.greet ترجع true بين أي نسختين.

04

عند وضع الدالة greet على User.prototype، ماذا ترجع العبارة Object.hasOwn(u1, "greet")؟

05

تُعد إضافة دوال مساعدة مخصصة مباشرةً إلى Object.prototype ممارسة احترافية موصى بها في المشاريع الحديثة.

06

ماذا يحدث عند إسناد u1.theme = "dark" بينما يحمل User.prototype.theme القيمة "light"؟

07

ماذا يرجع المحرك عند البحث عن خاصية غير موجودة في النسخة ولا في أي مستوى من سلسلة نماذجها الأولية؟

08

يجب كتابة دوال النموذج الأولي المعتمدة على this بصياغة function العادية بدلاً من الدوال السهمية.

09

لماذا يُحذر من استدعاء Object.setPrototypeOf لتغيير النموذج الأولي لكائن حي أثناء التشغيل المكثف؟

10

ما الاستدعاء الدفاعي الذي يجمد النموذج الجذري لمنع حقن خصائص خبيثة تؤثر على كافة الكائنات؟