JavaScript ليست لغة موجهة نحو الكائن ولا توفر طرق الميراث التقليدية ، ولكنها توفر وسيلة للميراث الأولي ، باستخدام خصائص النموذج الأولي الذي توفره لتحقيق الميراث.
سلسلة النموذج الأولي هي الطريقة الرئيسية للميراث في JavaScript.
الفكرة الأساسية لسلسلة النموذج الأولي هي: استخدام النماذج الأولية للسماح نوع مرجعي براث خصائص وطرق نوع مرجعي آخر.
العلاقة بين المُنشئين والنماذج الأولية والحالات: يحتوي كل مُنشئ على كائن النموذج الأولي ، ويحتوي كائن النموذج الأولي على مؤشر إلى المنشئ ، ويحتوي المثيل على مؤشر داخلي لكائن النموذج الأولي.
إذا كان كائن النموذج الأولي يساوي مثيلًا لكائن آخر ، فسيحتوي كائن النموذج الأولي على مؤشر إلى نموذج أولي آخر ، وبالتالي ، يحتوي النموذج الأولي الآخر أيضًا على مؤشر إلى مُنشئ آخر.
الوضع الأساسي لتنفيذ سلسلة النموذج الأولي:
الدالة supertype () {this.property = true ؛} supertype.prototype.getSuperValue = function () {return this.property ؛ {return this.subproperty ؛} ؛ var extary = new Type () ؛ Alert (easule.getSuperValue ()) ؛ // حقيقييرث النوع الفرعي supertype ، والذي يتم تحقيقه عن طريق إنشاء مثيل SuperType وتعيين المثيل إلى النموذج الفرعي. يتمثل جوهر التنفيذ في إعادة كتابة كائن النموذج الأولي واستبداله بمثيل من نوع جديد. وبهذه الطريقة ، توجد أيضًا خصائص وطرق موجودة في الأصل في مثيل SuperType في النمط الفرعي. ثم أضف طريقة إلى النوع الفرعي. النموذج ، الذي يضيف طريقة أخرى بناءً على وراثة خصائص وطرق SuperType.
يتم التعبير عن علاقة المثيل في المثال أعلاه على النحو التالي:
لا يستخدم ما سبق النموذج الأولي الذي توفره النوع الفرعي افتراضيًا ، ولكن بدلاً من ذلك استبدله بنموذج أولي جديد ؛ هذا النموذج الأولي الجديد هو مثيل SuperType. هناك أيضًا مؤشر للنموذج الأولي الذي ينفذ SuperType داخل النموذج الأولي الجديد. نتيجة لذلك ، يشير المثيل إلى النموذج الأولي للنوع الفرعي ، والذي يشير إلى النموذج الأولي لـ SuperType. لا تزال طريقة getValue () في النموذج supertype.prototype ، ولكن النموذج الأولي في النموذج الفرعي. هذا لأن الخاصية هي خاصية مثيل ، و GetSuperValue () هي طريقة النموذج الأولي. نظرًا لأن النمط الفرعي. النموذج أصبح الآن مثيلًا لـ SuperType ، فإن الخاصية تقع بشكل طبيعي في هذه الحالة.
ملاحظة: يشير مثيل.
عند الوصول إلى سمة في وضع القراءة ، يتم البحث عن المثيل لأول مرة عن تلك السمة. إذا لم يتم العثور على العقار. ثم سيستمر البحث عن النموذج الأولي للمثال. عندما يتم تحقيق الميراث من خلال سلسلة النموذج الأولي ، يمكن أن تستمر عملية البحث في التحرك لأعلى على طول سلسلة النموذج الأولي.
النموذج الافتراضي
جميع الأنواع المرجعية ترث كائن بشكل افتراضي ، ويتم تنفيذ هذا الميراث أيضًا من خلال سلسلة النموذج الأولي. النموذج الافتراضي لجميع الوظائف هو مثيل للكائن. لذلك ، سيحتوي النموذج الأولي الافتراضي على مؤشر داخلي إلى Object.prototype. هذا هو السبب في أن الأنواع المخصصة سترث طرقًا مثل ToString () ، و Valueof () ، وما إلى ذلك.
سلسلة النموذج الأولي الكامل:
في نظام الميراث أعلاه ، يرث النوع الفرعي supertype ، وروث SuperType. عندما يتم استدعاء مثيل. toString () ، يتم استدعاء الطريقة المحفوظة في Object.prototype بالفعل.
تحديد العلاقة بين المثيل والنموذج الأولي
هناك طريقتان لتحديد العلاقة بين النموذج الأولي ومثيل:
استخدم مشغل مثيل
التنبيه (مثيل كائن extipof) ؛ التنبيه (مثيل مثيل SuperType) ؛ التنبيه (مثيل النوع الفرعي) ؛
بسبب العلاقة بين سلسلة النموذج الأولي ، كل ما سبق يعود صحيح.
استخدام طريقة isprototypeof ()
التنبيه (Object.prototype.isprototypeof (مثيل)) ؛ ALERT (supertype.prototype.isprototypeof (مثيل)) ؛ ALERT (النوع الفرعي. ALERT (النوع الفرعي.
حدد الطريقة بعناية
يجب وضع الكود لإضافة طرق إلى النموذج الأولي بعد العبارة التي تحل محل النموذج الأولي.
الدالة supertype () {this.property = true ؛} supertype.prototype.getSuperValue = function () {return this.property ؛ this.subproperty ؛} ؛ // اكتب الطريقة الفرعية. // خطأ شنيعفي المثال أعلاه ، تجدر الإشارة إلى أنه بعد استبدال النموذج الأولي بمثال SuperType ، ثم تحديد هاتين الطريقتين.
بالإضافة إلى ذلك ، عند الوراثة من خلال سلسلة النموذج الأولي ، لا يمكنك استخدام الكائن الحرفي لإنشاء طريقة نموذجية. لأن القيام بذلك سيعيد كتابة سلسلة النموذج الأولي:
الدالة supertype () {this.property = true ؛} supertype.prototype.getSuperValue = function () {return this.property ؛ نوع فرعي غير صالح. // خطأيعين المثال أعلاه مثيل SuperType إلى النموذج الأولي ، ثم يستبدل النموذج الأولي بكائن حرفي. يحتوي النموذج الأولي الحالي على مثيل للكائن ، وليس مثيلًا لـ SuperType ، ولا توجد علاقة بين النوع الفرعي و SuperType.
مشكلة سلسلة النموذج الأولي
كما ذكرنا سابقًا ، تتم مشاركة سمات النموذج الأولي الذي يحتوي على أنواع مرجعية بواسطة جميع الحالات ؛ هذا هو السبب في تحديد السمات في المنشئ وليس في كائن النموذج الأولي.
الدالة supertype () {this.colors = ["Red" ، "Blue" ، "Green"] ؛} Function Subtype () {} subtype.prototype = new SuperType () ؛ var extal11 = new type () ؛ eChate1.colors.push ("black") // "Red" ، "Blue" ، "Green" ، "Black" var estance2 = new Type () ؛ Alert (extal2.colors) ؛ // "Red" ، "Blue" ، "Green" ، "Black"في المثال أعلاه ، يتم تعريف خاصية الألوان في مُنشئ SuperType ، الذي يحتوي على صفيف ، وسيكون لكل مثيل من SuperType خاصية ألوان تحتوي على صفيفها الخاص. بعد أن يرث النوع الفرعي supertype من خلال سلسلة النموذج الأولي ، يصبح النموذج الفرعي. النمط المحدد مثيلًا لـ SuperType ، لذلك يحتوي أيضًا على سمة ألوانه الخاصة. ومع ذلك ، فإن جميع مثيلات النوع الفرعي تشترك في هذا الممتلكات ألوان واحدة.
مشكلة أخرى هي أنه لا توجد طريقة لتمرير المعلمات إلى مُنشئ الطبقة الفائقة دون التأثير على جميع مثيلات الكائنات.
ما سبق هو المعرفة ذات الصلة بجافا سكريبت استنادًا إلى ميراث سلسلة النموذج الأولي الذي قدمه لك المحرر. آمل أن يكون ذلك مفيدًا لك. إذا كان لديك أي أسئلة ، فيرجى ترك رسالة لي وسوف يرد المحرر إليك في الوقت المناسب. شكرا جزيلا لدعمكم لموقع wulin.com!