البرمجة

فهم النماذج الأولية في جافاسكربت

النماذج الأولية الأصيلة (Native Prototypes) في جافاسكربت

في عالم البرمجة بلغة جافاسكربت، تعد النماذج الأولية (Prototypes) أحد المفاهيم الأساسية التي تمثل حجر الزاوية لفهم آلية الوراثة (Inheritance) في هذه اللغة. تعتبر النماذج الأولية الأصيلة أو ما يعرف بـ “Native Prototypes” جزءًا لا يتجزأ من بناء كائنات جافاسكربت، حيث تسمح للمطورين بإنشاء هياكل بيانات مرنة ومتعددة الاستخدامات عبر الأساليب المتاحة بشكل افتراضي من قبل البيئة البرمجية.

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

في جافاسكربت، كل كائن (Object) يحمل نموذجًا أوليًا أو prototype. النموذج الأولي هو الكائن الذي يورث منه الكائن الحالي خصائصه وأساليبه. بشكل افتراضي، كل كائن يتم إنشاؤه من كائن أصيل مدمج في لغة جافاسكربت يسمى “النموذج الأولي الأصلي” (Native prototype). هذه النماذج الأولية تتضمن مجموعة من الأساليب والخصائص المدمجة التي توفرها جافاسكربت لمساعدة المطورين في التعامل مع الكائنات بكل سلاسة.

على سبيل المثال، الكائنات المدمجة مثل Array, Object, و Function تحتوي جميعها على نماذج أولية أصيلة تحتوي على أساليب وخصائص توفر وظائف إضافية مثل push, pop, toString و hasOwnProperty. هذه الأساليب والخصائص هي في الحقيقة جزئية من النماذج الأولية الأصيلة لهذه الكائنات، ويمكن للمطورين استخدامها مباشرة في برامجهم دون الحاجة لتعريفها من جديد.

كيف يعمل النموذج الأولي الأصلي؟

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

javascript
let person = { name: 'Ali', age: 25 };

في هذا المثال، الكائن person هو كائن بسيط يحتوي على خاصيتين فقط: name و age. ومع ذلك، حتى وإن لم يتم تحديد أساليب داخل هذا الكائن، فإنه يمكن الوصول إلى أساليب مثل toString() و hasOwnProperty() لأنه ورث هذه الأساليب من النموذج الأولي الأصلي لكائن Object.

كيفية الوصول إلى النموذج الأولي؟

يتم الوصول إلى النموذج الأولي للكائن عبر خاصية خاصة تسمى __proto__. هذه الخاصية توفر وسيلة للوصول إلى الكائن النموذج الأولي المرتبط بالكائن الحالي. يُلاحظ أن __proto__ ليست جزءًا من المواصفة الرسمية لجافاسكربت، ولكنها مدعومة في معظم المتصفحات.

javascript
console.log(person.__proto__);

سيعرض هذا الكود الكائن النموذج الأولي المرتبط بكائن person. عادةً ما يحتوي هذا الكائن على الأساليب المدمجة مثل toString و hasOwnProperty.

دور النماذج الأولية في الوراثة (Inheritance)

النماذج الأولية في جافاسكربت تلعب دورًا مهمًا جدًا في دعم الوراثة. الوراثة في جافاسكربت تعتمد على فكرة أن الكائنات يمكنها “وراثة” خصائص وأساليب من الكائنات الأخرى من خلال النماذج الأولية.

في المثال التالي، نوضح كيف يمكن لكائن جديد وراثة الخصائص والأساليب من كائن آخر عبر النماذج الأولية:

javascript
function Animal(name) { this.name = name; } Animal.prototype.speak = function() { console.log(this.name + ' makes a noise.'); }; let dog = new Animal('Dog'); dog.speak(); // "Dog makes a noise."

في هذا المثال، يتم تعريف دالة Animal كدالة منشئة (constructor) لإنشاء كائنات جديدة. ثم نضيف دالة speak إلى prototype الخاص بكائن Animal. عندما يتم إنشاء كائن جديد من Animal مثل dog، فإنه يمكنه الوصول إلى دالة speak عبر النموذج الأولي الأصلي.

النماذج الأولية الأصيلة للكائنات المدمجة

في جافاسكربت، كل كائن مدمج مثل Object, Array, String, Function, و Number يحتوي على نموذج أولي أصيل يوفر أساليب وخصائص مدمجة يمكن استخدامها مباشرة. من بين أشهر هذه النماذج الأولية الأصيلة:

  1. النموذج الأولي لـ Object:
    يحتوي على الأساليب الأساسية مثل:

    • hasOwnProperty: للتحقق مما إذا كانت خاصية معينة تابعة للكائن مباشرة.

    • toString: لتحويل الكائن إلى تمثيل نصي.

  2. النموذج الأولي لـ Array:
    يحتوي على العديد من الأساليب مثل:

    • push: لإضافة عنصر في نهاية المصفوفة.

    • pop: لإزالة العنصر الأخير من المصفوفة.

    • map: لتنفيذ دالة على كل عنصر في المصفوفة.

  3. النموذج الأولي لـ Function:
    يحتوي على الأساليب مثل:

    • call: لاستدعاء دالة مع سياق مخصص.

    • apply: لاستدعاء دالة مع مجموعة من المعاملات.

  4. النموذج الأولي لـ String:
    يحتوي على الأساليب مثل:

    • charAt: للحصول على الحرف في موضع معين.

    • split: لتقسيم السلسلة النصية إلى مصفوفة من الأجزاء.

  5. النموذج الأولي لـ Number:
    يحتوي على الأساليب مثل:

    • toFixed: لتحديد عدد المنازل العشرية في الرقم.

    • toExponential: لتحويل الرقم إلى الشكل العلمي.

تعديل النماذج الأولية الأصيلة

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

javascript
Array.prototype.first = function() { return this[0]; }; let myArray = [1, 2, 3]; console.log(myArray.first()); // 1

في هذا المثال، تم إضافة دالة first إلى نموذج Array الأولي. الآن، يمكن لجميع مصفوفات جافاسكربت الاستفادة من هذه الدالة.

استخدام النماذج الأولية الأصيلة في بناء الهياكل المعقدة

النماذج الأولية الأصيلة في جافاسكربت يمكن أن تكون مفيدة بشكل كبير في بناء الهياكل المعقدة. بفضل الوراثة عبر النماذج الأولية، يمكن إنشاء كائنات متقدمة تستفيد من الأساليب والخصائص المدمجة مع إضافة سلوكيات مخصصة.

على سبيل المثال، إذا أردنا إنشاء كائن يعبر عن نوع معين من الحيوانات يمكنه التحدث:

javascript
function Dog(name, breed) { Animal.call(this, name); this.breed = breed; } Dog.prototype = Object.create(Animal.prototype); Dog.prototype.constructor = Dog; Dog.prototype.speak = function() { console.log(this.name + ' barks.'); }; let myDog = new Dog('Max', 'Golden Retriever'); myDog.speak(); // "Max barks."

في هذا المثال، تم إنشاء Dog ككائن موروث من Animal باستخدام الوراثة عبر النماذج الأولية. الكائن myDog يرث الأساليب من Animal, لكنه يضيف سلوكه الخاص.

الخاتمة

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