تصف هذه المقالة آلية الميراث JavaScript. شاركه للرجوع إليه. التحليل المحدد هو كما يلي:
من الصعب عمومًا على المبتدئين فهم آلية الميراث للغة JavaScript. لا يحتوي على مفهوم "الفئة الفرعية" و "فئة الوالدين" ، كما أنه ليس له التمييز بين "الفئة" و "مثيل". يعتمد بالكامل على نموذج "سلسلة النموذج الأولي" الغريب للغاية لتحقيق الميراث.
قضيت الكثير من الوقت في دراسة هذا الجزء وأتلقى الكثير من الملاحظات. لكنهم جميعهم ذاكرة قسرية ولا يمكن فهمهم بشكل أساسي.
1. كيفية إنشاء فصل
لنفترض أن هناك فئة تسمى الشخص على النحو التالي:
انسخ الرمز على النحو التالي: var person = function (name ، age) {
this.name = name ؛
this.age = العمر ؛
}
person.prototype.getName = function () {
إرجاع هذا.
}
كما ذكر أعلاه: يمثل الشخص جميع الأشخاص على الأرض ، وكل شخص لديه هاتانانان أساسيتان: الاسم والعمر ؛ الآن نريد تنفيذ فصل دراسي ، ثم نعرف ؛ الطلاب هم أيضًا شخص ، والطلاب لديهم أيضًا سمات مثل الاسم والعمر ؛ السؤال الآن هو كيف يمكننا بناء هذه العلاقة؟
دعونا أولاً نلقي نظرة على كيفية قيام اللغات الموجهة نحو الكائنات النقي (مثل ActionsScript3)
انسخ الرمز على النحو التالي: طلاب الفصل يوسعون الشخص {} ؛ // إنه بسيط للغاية ، سطر واحد من التعليمات البرمجية ؛ أن تكون أكثر دقة ، كلمة واحدة-تمتد
2. كيف يمكنني فعل ذلك إذا قمت بتغييره إلى JS
قبل شرح تنفيذ آلية الميراث JS ، دعونا أولاً نفهم سلسلة النموذج الأولي لـ JS:
نسخة الكود كما يلي: var person = شخص جديد ('flised-flw' ، 21) ؛
person.getName () ؛ // "FIDISED-FLW"
أما بالنسبة لطريقة getName () أعلاه ، كيف يتم تنفيذها؟ أولاً ، ستجد ما إذا كانت هناك طريقة getName () في وظيفة الشخص وتجد لا ؛ ثم انتقل إلى شخص. ثم نسميها ، ماذا لو لم يكن كذلك؟ استمر في اتباع نفس الطريقة والبحث على طول النموذج الأولي حتى تجد الطريقة أو الوصول إلى أعلى سلسلة النموذج الأولي!
على سبيل المثال ، يوجد الآن مُنشئ يسمى الكلب يمثل النموذج الأولي لكائن الكلب.
انسخ الرمز كما يلي: دالة الكلب (الاسم) {
this.name = name ؛
}
باستخدام جديد لهذا المنشئ سيؤدي إلى إنشاء مثيل لكائن الكلب.
نسخة الكود كما يلي: var doga = new dog ('Big Hair') ؛
تنبيه (doga.name) ؛ // شعر كبير
انتبه إلى هذه الكلمة الرئيسية في المنشئ ، والذي يمثل كائن المثيل الذي تم إنشاؤه حديثًا.
3. عيوب المشغل الجديد
هناك عيب واحد في استخدام المنشئين لإنشاء كائنات مثيل ، أي القدرة على مشاركة السمات والأساليب.
على سبيل المثال ، في مُنشئ كائن الكلب ، قم بتعيين أنواع السمة الشائعة لكائن مثيل.
انسخ الرمز كما يلي: دالة الكلب (الاسم) {
this.name = name ؛
this.species = 'canidae' ؛
}
ثم ، يتم إنشاء كائنات مثيل:
نسخة الكود كما يلي: var doga = new dog ('Big Hair') ؛
var dogb = new dog ('eimao') ؛
سمات الأنواع لهذين الكائنين مستقلة ، ولن تؤثر تعديل واحدة على الآخر.
نسخة الكود كما يلي: doga.species = 'Female' ؛
تنبيه (dogb.seies) ؛ // إظهار "عائلة الكلاب" ، لا تتأثر دوجا
كل كائن مثيل له نسخته الخاصة من خصائصه وطرقه. هذا لا يفشل فقط في مشاركة البيانات ، ولكن أيضًا مضيعة كبيرة للموارد.
لذلك: فكرة الميراث: قم بتنفيذ آلية الميراث من خلال سلسلة النموذج الأولي الفريد من JS!
4. الميراث على أساس سلسلة النموذج الأولي
1. الميراث والتنفيذ المباشر
انسخ الرمز كما يلي: var students = function (name ، age ، sid) {
person.call (هذا ، الاسم ، العمر) ؛
this.sid = sid ؛
}
students.prototype = شخص جديد () ؛ // ضع الشخص على سلسلة النموذج الأولي للطلاب لتنفيذ آلية الميراث
students.prototype.constructor = الطلاب ؛
students.prototype.getResults = function () {
// احصل على درجات الطلاب
}
من الضروري عدم تفويت الطلاب. ، عند تحديد مُنشئ ، يكون النموذج الأولي الافتراضي هو مثيل كائن ، ثم يتم ضبط سمة المنشئ للنموذج الأولي تلقائيًا على الوظيفة نفسها! ! ! إذا تم ضبط النموذج الأولي يدويًا على كائن آخر ، فلن يكون للكائن الجديد بطبيعة الحال قيمة مُنشئ للكائن الأصلي ، لذلك يجب إعادة تعيين سمة مُنشئه. يحب:
انسخ الرمز كما يلي: var test = function () {
this.time = "الآن" ؛
}
console.log (test.prototype) ؛ // كائن {} كائن فارغ
console.log (test.prototype.constructor) ؛ // function () {this.time = "now" ؛} ، والوظيفة نفسها
// إذا قمت بتغيير خاصية النموذج الأولي للاختبار
Test.Prototype = {
Somefunc: function () {
console.log ('Hello World!') ؛
}
} ؛
console.log (test.prototype.constructor) ؛ // دالة كائن () {[الكود الأصلي]}
// ثم ستجد أن الإشارة خاطئ تمامًا ، لذلك عند تغيير خاصية النموذج الأولي يدويًا ، تحتاج إلى تغيير مشاركته ؛
بعد الاختبار أعلاه ، ستعرف لماذا تحتاج إلى تعديل قيمة المنشئ.
2. تغليف الوظيفة الموروثة تمتد
انسخ الرمز على النحو التالي: تمديد الوظيفة (الفئة الفرعية ، الفئة الفائقة) {
var f = function () {} ؛
f.prototype = superclass.prototype ؛
subcleass.prototype = new f () ؛
subcleass.prototype.constructor = فئة فرعية ؛
}
في الواقع ، فإن وظيفة هذه الوظيفة هي مجرد تغليف لعملية الميراث أعلاه ، والاختلافات هي:
يرث فقط سمة النموذج الأولي للفئة الفائقة ، ولا يرث السمات في مُنشئ الطبقة الفائقة ؛
ميزة هذا هو الحد من النفقات العامة للمؤسسة الجديدة!
بالطبع ، المشكلة اللاحقة هي أنه لا يمكنك ببساطة تمرير هذه الوظيفة للسماح للفئة الفرعية براث جميع خصائص الطبقة الفائقة
يحسن:
انسخ الرمز كما يلي: // متابعة لإضافة سطر من التعليمات البرمجية إلى مُنشئ الطلاب:
person.call (هذا ، الاسم ، العمر) ؛
5. ملخص
باستخدام مبدأ سلسلة النموذج الأولي لـ JS ، يمكننا بسهولة تنفيذ آلية الميراث JS. على الرغم من أنها ليست صارمة للغاية ، فقد تم تحقيق هدفي: حاول أن تظهر رمزًا متكررًا مرة واحدة!
آمل أن تكون هذه المقالة مفيدة لبرمجة JavaScript للجميع.