نوفيل
الرئيسيةالكورساتالتحديات⚔️ المبارزاتالمقالاتالأدواتتغريداتالمجتمع
دخولابدأ مجاناً
الرئيسيةالكورساتالتحديات⚔️ المبارزاتالمقالاتالأدواتتغريداتالمجتمع
نوفيل

منصة تعليم البرمجة الأولى بالعربي. تعلم من الصفر حتى الاحتراف مع كورسات احترافية وتحديات ذكاء اصطناعي.

المنصة

  • الكورسات
  • التحديات
  • المقالات
  • الأدوات

الحساب

  • إنشاء حساب
  • تسجيل الدخول
  • لوحة التحكم
  • الملف الشخصي

روابط

  • سياسة الخصوصية
  • شروط الاستخدام
  • عن نوفيل
  • تواصل معنا

© 2026 نوفيل. جميع الحقوق محفوظة.

صُنع بـ في مصر

نوفيل
الرئيسيةالكورساتالتحديات⚔️ المبارزاتالمقالاتالأدواتتغريداتالمجتمع
دخولابدأ مجاناً
الرئيسيةالكورساتالتحديات⚔️ المبارزاتالمقالاتالأدواتتغريداتالمجتمع
JS

منهج JavaScript

دليل مرجعي شامل

كل اللغات
مدرسة البرمجة/منهج JavaScript/مفهوم الـ Prototypes في جافاسكريبت

مفهوم الـ Prototypes في جافاسكريبت

prototype javascriptالوراثة النموذجيةprototype chainprototypal inheritanceobject prototype js

جدول مرجعي سريع

1
المفهومالتعريف
Prototypeكائن يحتوي خصائص ودوال يرثها كائن آخر
Prototype Chainسلسلة البحث عن خاصية عبر عدة مستويات Prototype
Constructor Functionدالة تُستخدم مع new لإنشاء كائنات

الشرح

الـ Prototype هو الآلية الأساسية التي تُطبّق بها جافاسكريبت الوراثة (Inheritance)، وهي تختلف جوهرياً عن نموذج الوراثة الكلاسيكي في لغات مثل Java أو C++. بدلاً من "الفئات" (Classes) الصارمة، تعتمد جافاسكريبت على مفهوم "الوراثة النموذجية" (Prototypal Inheritance) — كل كائن في جافاسكريبت مرتبط بكائن آخر يُسمى Prototype الخاص به، ويمكنه "استعارة" خصائصه ودواله منه.

عندما تحاول الوصول لخاصية أو دالة على كائن ولا تجدها مباشرة عليه، لا يتوقف محرك جافاسكريبت هناك — بل يبحث في الـ Prototype الخاص بذلك الكائن، فإن لم يجدها هناك أيضاً، يبحث في Prototype الخاص بذلك الـ Prototype، وهكذا صعوداً حتى يصل إلى null. تُسمى هذه السلسلة "سلسلة الـ Prototype" (Prototype Chain)، وهي السبب في أن كل المصفوفات مثلاً "ترث" دوالاً جاهزة مثل map وfilter، رغم أنك لم تُعرّفها بنفسك في كل مصفوفة تُنشئها.

كل دالة في جافاسكريبت (عند استخدامها كدالة بانية Constructor) تمتلك خاصية تلقائية تُسمى prototype، ويمكنك إضافة دوال عليها لتُصبح متاحة لكل الكائنات التي تُنشأ من تلك الدالة البانية عبر new — وهذا يُوفر الذاكرة بشكل كبير، لأن الدالة تُخزَّن مرة واحدة فقط في الـ Prototype، بدل تكرارها في كل كائن على حدة.

في الكود الحديث، نادراً ما تتعامل مع الـ Prototype مباشرة بهذا الشكل، لأن صيغة Classes الأحدث (وهي التي سنتعلمها في الموضوع التالي) توفر واجهة أنظف وأسهل قراءة لنفس الآلية الأساسية تماماً — فالـ Classes في جافاسكريبت ما هي في جوهرها إلا "غلاف تجميلي" (Syntactic Sugar) فوق نظام الـ Prototype، وليست نظام وراثة كلاسيكي حقيقي جديد كلياً.

الصياغة (Syntax)

syntax
1function شخص(اسم) {
2 this.اسم = اسم;
3}
4
5// إضافة دالة على الـ Prototype (تُشارك بين كل الكائنات)
6شخص.prototype.يقول_مرحبا = function () {
7 return `مرحباً، أنا ${this.اسم}`;
8};
9
10const ص1 = new شخص("أحمد");
11console.log(ص1.يقول_مرحبا()); // "مرحباً، أنا أحمد"

أمثلة عملية

مثال 1: سلسلة الـ Prototype للمصفوفات

سلسلة الـ Prototype للمصفوفات
1// كل المصفوفات "ترث" دوالها من Array.prototype
2const مصفوفة = [1, 2, 3];
3console.log(مصفوفة.__proto__ === Array.prototype); // true
4
5// يمكنك رؤية سلسلة الـ Prototype
6console.log(Array.prototype.__proto__ === Object.prototype); // true
7console.log(Object.prototype.__proto__); // null — نهاية السلسلة

مثال 2: مشاركة الدوال عبر Prototype لتوفير الذاكرة

مشاركة الدوال عبر Prototype لتوفير الذاكرة
1// توفير الذاكرة: الدالة تُخزَّن مرة واحدة في prototype فقط
2function سيارة(الموديل) {
3 this.الموديل = الموديل;
4}
5سيارة.prototype.وصف = function () {
6 return `سيارة موديل ${this.الموديل}`;
7};
8
9const س1 = new سيارة("2024");
10const س2 = new سيارة("2025");
11console.log(س1.وصف === س2.وصف); // true — نفس الدالة بالضبط، غير مكررة

نصائح احترافية

  • —الوراثة في جافاسكريبت نموذجية (Prototypal) وليست كلاسيكية — كل كائن يرث من كائن آخر مباشرة، لا من "قالب" فئة منفصل.
  • —صيغة class الحديثة هي غلاف تجميلي فوق نظام Prototype نفسه، وليست نظاماً جديداً كلياً.
  • —ضع الدوال المشتركة على الـ prototype وليس داخل الدالة البانية نفسها لتوفير الذاكرة عبر آلاف الكائنات.
  • —__proto__ للوصول المباشر غير مستحسن في الكود الحديث — استخدم Object.getPrototypeOf() بدلاً منه.

الدرس السابق

التعامل مع النماذج والتحقق منها (Form Validation)

الدرس التالي

الفئات والمشيدات (Classes & Constructors)

نوفيل

منصة تعليم البرمجة الأولى بالعربي. تعلم من الصفر حتى الاحتراف مع كورسات احترافية وتحديات ذكاء اصطناعي.

المنصة

  • الكورسات
  • التحديات
  • المقالات
  • الأدوات

الحساب

  • إنشاء حساب
  • تسجيل الدخول
  • لوحة التحكم
  • الملف الشخصي

روابط

  • سياسة الخصوصية
  • شروط الاستخدام
  • عن نوفيل
  • تواصل معنا

© 2026 نوفيل. جميع الحقوق محفوظة.

صُنع بـ في مصر