قبل القيام بشيء ما ، يجب أولاً أن تكون واضحًا بشأن فوائد القيام بذلك. أعتقد أنه لا أحد على استعداد لفعل الأشياء دون سبب. بشكل عام ، عندما نتصميم فصول ، نأمل في الواقع تقليل تكرار الكود. باستخدام الميراث يمكن أن يفعل هذا تماما. بمساعدة آلية الميراث ، يمكنك التصميم مرة أخرى بناءً على الفصول الموجودة والاستفادة الكاملة من الطرق المختلفة التي لديهم بالفعل ، وتعديل التصميم بسهولة أكبر. لن أقول الكثير من الهراء ، أعط مثالاً:
نسخة الكود كما يلي:
وظيفة الشخص (الاسم) {
this.name = name ؛
}
person.prototype.getName = function () {
إرجاع هذا.
}
مدون الوظيفة (الاسم ، المدونة) {
person.call (هذا ، الاسم) ؛
this.blog = Blog ؛
}
var Bloger = new Bloger ("Zhen" ، "// www.vevb.com") ؛
ALERT (Bloger.name == "Zhenn") ؛ /*العودة إلى ture*/
ALERT (Bloger.blog) /*Tip//www.vevb.com*/
ALERT (Bloger.getName () == "Zhenn") ؛ /*نصيحة "Bloger.getName ليست وظيفة"*/
من المثال أعلاه ، يمكننا أن نرى أن المدون ينادي بشكل ديناميكي الخصائص والأساليب الأصلية لشخص فئة الأم من خلال مكالمة بداخله (لتوضيح المكالمة ، يرجى الرجوع إلى //www.vevb.com/article/62086.htm) ، والتي يمكن فهمها كشخص يرث المدون وتصبح فرعيًا. ومع ذلك ، سيجد الطلاب الدقيقون أن الأساليب الموجودة في كائن النموذج الأولي الشخص لا يمكن أن يتم مورثها عن طريق الاعتماد فقط على المكالمة ، وهذا هو السبب في أنه يطالب "bloger.getName ليس دالة". لكن لا تقلق ، فقط تعامل مع الكود أعلاه لحل هذه المشكلة!
نسخة الكود كما يلي:
وظيفة الشخص (الاسم) {
this.name = name ؛
}
person.prototype.getName = function () {
إرجاع هذا.
}
مدون الوظيفة (الاسم ، المدونة) {
person.call (هذا ، الاسم) ؛
this.blog = Blog ؛
}
/*يرجى ملاحظة سطرين من الكود التاليان*/
bloger.prototype = new person () ؛
Bloger.prototype.constructor = Bloger ؛
var Bloger = new Bloger ("Zhen" ، "// www.vevb.com") ؛
ALERT (Bloger.name == "Zhenn") ؛ /*العودة إلى ture*/
ALERT (Bloger.blog) /*Tip//www.vevb.com*/
ALERT (Bloger.getName () == "Zhenn") ؛ /* موجه صحيح*/
هنا نحتاج إلى شرح هذين الخطين من الكود. نحن نعلم أن كل مُنشئ لديه سمة نموذجية ، والتي تشير إلى كائن النموذج الأولي للمُنشئ. في الواقع ، فإن كائن النموذج الأولي هو أيضًا كائن مثيل ، ولكن يمكن توفير السمات والأساليب المحددة في كائن النموذج الأولي لجميع كائنات المثيلات للمشاركة. من هذا ، يمكننا أن نرى أن نية إضافة سطرين من التعليمات البرمجية هي تعيين كائن النموذج الأولي للفئة الفرعية للإشارة إلى كائن تم إنشاؤه من فئة الأصل ، وأن الكائن المسبق للفئة الأصل سوف يرث جميع أساليب السمة النموذجية للفئة الأم ، والتي تحقق هدفنا. يرث النموذج الأولي للفئة الفرعية خصائص وطرق جميع كائنات مثيل الفئة الأصل.
ومع ذلك ، يجب أن تلاحظ أيضًا أن المدون. هذا السطر من التعليمات البرمجية ، لأنه عندما يتم تعيين النموذج الأولي للفئة الفرعية على مثيل الفئة الأصل ، فإن سمة مُنشئها ستشير إلى الفئة الأصل ، لذلك يجب تعيين مُنشئ النموذج الأولي للفئة الفرعية للإشارة إلى الفئة الفرعية مرة أخرى. في هذه المرحلة ، تم تنفيذ ميراث جافا سكريبت بشكل مثالي!
من أجل تبسيط إعلان الفئات الفرعية ، يمكن كتابة العملية الكاملة لتوسيع الفئات الفرعية في وظيفة تسمى Extend ، وهي إنشاء فئة جديدة تعتمد على بنية فئة معينة:
نسخة الكود كما يلي:
تمتد الوظيفة (childclass ، parentClass) {
var f = new function () ؛
f.prototype = parentClass.Prototype ؛
childclass.prototype = new f () ؛
childclass.prototype.constructor = ChildClass ؛
}
مع وظيفة التمديد هذه ، يمكنك بسهولة تمديد الفئة الفرعية. فقط استدعاء هذه الوظيفة. يمكن تغيير سطرين من التعليمات البرمجية المضافة أعلاه لتمديد (المدون ، الشخص) ، والتي يمكن أن تحقق أيضًا ميراثًا كاملاً!