عند الحديث عن ميراث جافا سكريبت ، من المحتم أنه لا يمكن فصل سلسلة النموذج الأولي ، ولكن الميراث فقط من خلال سلسلة النموذج الأولي له العديد من أوجه القصور.
مشكلة ميراث عدم وجود معلمات
دعونا أولاً نلقي نظرة على جزء من رمز العينة لتنفيذ ميراث B من:
نسخة الكود كما يلي:
وظيفة A () {
}
A.Prototype.a1 = function () {} ؛
الوظيفة B () {
}
B.Prototype = جديد A () ؛
B.Prototype.b1 = function () {} ؛
var b = new b () ؛
تنبيه (B.Constructor == a) ؛ // حقيقي
تنبيه (B.Constructor == b) ؛ // خطأ شنيع
المشاكل الرئيسية في هذا الرمز هي:
1. يجب أن يتم إنشاء مثيل له كنموذج أولي لـ B ، ويتم تنفيذ مُنشئ A في هذا الوقت. ومع ذلك ، وفقًا للقواعد الموجهة للكائنات ، لا ينبغي تنفيذ B و Parent Class A قبل إنشاء إنشاء B.
2. غير النموذج الأولي لـ B ، مما أدى إلى عدم وجود B.Contructor ولكن A.
هناك مشكلة في ميراث فئة الجينسنغ
لنفترض أن A و B لهما معلمتان سلسلة S1 و S2. A يحسب الطول الإجمالي للسلاسل ، و B يدعو مباشرة A مع S1 و S2 كمعلمات:
نسخة الكود كما يلي:
الوظيفة A (S1 ، S2) {
this.totallength = s1.length + s2.length ؛
}
A.Prototype.a1 = function () {
} ؛
الوظيفة B (S1 ، S2) {
}
B.Prototype = جديد A () ؛
B.Prototype.b1 = function () {
} ؛
New B ("AB" ، "123") ؛
كما ترون ، لا توجد طريقة لتمرير S1 و S2 إلى A في هذا الرمز ، ولأنه لا توجد معلمات عند إنشاء نموذج A كنموذج أولي لـ B ، يحدث استثناء:
نسخة الكود كما يلي:
S1 غير محدد
حل
نطاق S1 و S2 هو فقط في B. لتمريرهما إلى A ، يمكنك فقط العمل في B. يمكن تحقيقه باستخدام طريقة تطبيق الوظيفة:
نسخة الكود كما يلي:
الوظيفة B (S1 ، S2) {
A. تطبيق (هذا ، الحجج) ؛
تنبيه (this.totallength) ؛
}
والسؤال التالي هو كيفية إضافة الطريقة A إلى النموذج الأولي B. هذا ليس بالأمر الصعب ، فقط انتقل من خلال النمط A.Protype ونسخ الطريقة إلى النمط B.Prototype. تجدر الإشارة إلى أنه بالنسبة للطرق التي تحمل الاسم نفسه ، تفضل الفئات الفرعية بشكل طبيعي (محملة) ، لذلك لا يمكن تجاوزها:
نسخة الكود كما يلي:
لـ (var m في النمط a.protype) {
إذا (!
B.Prototype [M] = A.Prototype [M] ؛
}
}
PostScript
بالنظر إلى أن اللغات عالية المستوى مثل C# و Java قد تخلى عن الميراث المتعدد ، تمت مناقشة وضع الميراث الفردي في هذه المقالة. سيتم أيضًا كتابة طريقة الميراث الموضحة في هذه المقالة كامتداد لـ Jraiser وسيتم إصدارها لاحقًا.