دعنا ندرس أولاً السؤال بعمق. ما هو ميراث جافا سكريبت؟
على سبيل المثال ، لدينا مُنشئ لكائن "حيوان".
وظيفة animal () {this.type = 'Animal' ؛ }هناك أيضًا مُنشئ لكائن "Cat".
دالة القط (الاسم ، اللون) {this.name = name ؛ this.color = اللون ؛ }نحن نعلم أن القطط تنتمي أيضًا إلى الحيوانات. إذا أراد كائن القط هذا أن يرث خصائص الكائن الحيواني ، فما الذي يجب أن نفعله؟
ملزمة مُنشئ
استخدام الربط المُنشئ هو أسهل طريقة ، ما عليك سوى استخدام الاتصال أو تطبيقه لربط الكائن الأصل بالكائن الخاص.
وظيفة Cat (الاسم ، اللون) {animal.apply (هذا ، الحجج) ؛ this.name = name ؛ this.color = اللون ؛ } var cat1 = new cat ("haha" ، 'Red') ؛ console.log (cat1.type) ؛ // الحيواناتومع ذلك ، هذه الطريقة نادرة نسبيا.
نسخ الميراث
إذا تم نسخ جميع خصائص وطرق الكائن الأصل في كائن الطفل ، يمكن أيضًا تحقيق الميراث.
وظيفة تمديد (الطفل ، الوالد) {var p = parent.prototype ؛ var c = child.prototype ؛ لـ (var i in p) {c [i] = p [i] ؛ } c.Uber = p ؛ // وظيفة الجسر}كيفية استخدام:
تمديد (القط ، حيوان) ؛ var cat1 = new cat ("haha" ، "red") ؛ تنبيه (cat1.type) ؛ // حيوانميراث النموذج الأولي (النموذج الأولي)
بالمقارنة مع الربط المباشر أعلاه ، فإن طريقة ميراث النموذج الأولي أكثر شيوعًا. لقد لخصت بإيجاز النموذج الأولي بنفسي.
كل وظيفة لها سمة نموذجية ، وهي إشارة إلى كائن. عند إنشاء مثيل جديد باستخدام الكلمة الرئيسية الجديدة ، سيرث كائن المثيل سمات وطرق من كائن النموذج الأولي.
وهذا يعني ، إذا كانت سمة النموذج الأولي لمؤسس "CAT" تتم توجيهها إلى مثيل "حيوان" ، ثم عند إنشاء مثيل كائن "CAT" ، يتم توريث خصائص وطرق الكائن "الحيوان".
مثال الميراث
cat.prototype = new Animal () ؛ cat.prototype.constructor = cat ؛ var cat1 = new cat ("haha" ، "red") ؛ console.log (cat1.constructor == cat) ؛ // true console.log (cat1.type) ؛ // حيوان1. في السطر الأول من الكود ، نوجه كائن النموذج الأولي لوظيفة CAT إلى مثيل لكائن حيوان (والذي يحتوي على سمة نوع الحيوان).
2. ماذا يعني السطر الثاني من الرمز؟
1) أولاً ، إذا لم نضيف سطر الرمز هذا ، فتشغيله
cat.prototype = new Animal () ؛
console.log (cat.prototype.constructor == Animal) ؛ //حقيقي
بمعنى آخر ، في الواقع ، يحتوي كل كائن نموذج أولي على سمة مُنشأة تشير إلى وظيفة مُنشئها.
2) دعونا نلقي نظرة على الكود التالي
cat.prototype = new Animal () ؛ var cat1 = new cat ("haha" ، 'Red') ؛ console.log (cat1.constructor == Animal) ؛ //حقيقيمما سبق نرى أن مُنشئ الحالة CAT1 هو حيوان ، لذلك من الواضح أنه خطأ. . . يتم إنشاء CAT1 بوضوح بواسطة New Cat () ، لذلك يجب علينا تصحيحه يدويًا. يتم تغيير قيمة مُنشئ كائن cat.prototype إلى CAT.
3) لذلك هذه أيضًا نقطة يجب أن نولي اهتمامًا لها. إذا استبدلنا كائن النموذج الأولي ، فيجب علينا تصحيح سمة المنشئ لكائن النموذج الأولي يدويًا.
O.Prototype = {} ؛
O.Prototype.constructor = o ؛
يرث مباشرة النموذج الأولي
منذ أن في الأشياء الحيوانية ، يمكن كتابة الخصائص غير المتغيرة مباشرة في النمط الحيواني. ثم دع Cat.Prototype يشير إلى animal.prototype ، الذي يدرك الميراث.
الآن دعنا نعيد كتابة كائن الحيوان أولاً على النحو التالي:
وظيفة animal () {} animal.prototype.type = 'Animal' ؛ثم تنفيذ الميراث:
cat.prototype = animal.prototype ؛ cat.prototype.constructor = cat ؛ var cat1 = new cat ("haha" ، "red") ؛ console.log (cat1.type) ؛ // الحيواناتمقارنة بالطريقة السابقة ، يبدو أن هذه الطريقة أكثر كفاءة (لا يتم إنشاء مثيلات حيوانية) ، ومساحة توفير. ولكن هل هذا صحيح؟ الجواب غير صحيح ، دعنا نستمر في القراءة.
cat.prototype = animal.prototype ؛
يتيح هذا السطر من الكود cat.prototype و animal.prototype للإشارة إلى نفس الكائن ، لذلك إذا تم تغيير خاصية معينة من النمط cat.protype ، فسيتم انعكاسها على النمط الحيواني.
على سبيل المثال ، نركض:
console.log (animal.prototype.constructor == Animal) // false
اتضح أنه كاذب ، لماذا؟ cat.prototype.constructor = cat ؛ سيؤدي هذا الخط أيضًا إلى تغيير خاصية مُنشئ Animal.prototype.
استخدم كائنات فارغة كوسيط
var f = function () {} ؛ f.prototype = animal.prototype ؛ cat.prototype = new f () ؛ cat.prototype.constructor = cat ؛الجمع بين الطريقتين أعلاه ، لأن F هو كائن فارغ ، لا يشغل الذاكرة تقريبًا. لن يؤثر تعديل كائن Cat النموذجية في هذا الوقت على كائن النموذج الأولي للحيوان.
console.log (animal.prototype.constructor == Animal) ؛ // حقيقي
ثم نغلف الطريقة أعلاه:
وظيفة تمديد (الطفل ، الأصل) {var f = function () {} ؛ f.prototype = parent.prototype ؛ child.prototype = new f () ؛ child.prototype.constructor = الطفل ؛ child.uber = parent.prototype ؛ }عند استخدامه ، تكون الطريقة كما يلي:
تمديد (القط ، حيوان) ؛ var cat1 = new cat ("haha" ، "red") ؛ console.log (cat1.type) ؛ // حيوانchild.uber = parent.prototype ؛ هذا السطر من التعليمات البرمجية هو وظيفة جسر ، مما يتيح سمة Uber للكائن الطفل للإشارة مباشرة إلى سمة النموذج الأولي للكائن الأصل ، وهو ما يعادل فتح قناة تسمى Uber على الكائن الخاص ، بحيث يمكن لمثيل الكائن الطفل استخدام جميع خصائص وطرق الكائن الأصل.
ما سبق هو فهمي لراثي كائنات جافا سكريبت. آمل أن يساعدك أكثر أو أقل. شكرا لك على قراءتك.