كلغة موجهة للكائنات (JS تعتمد على الكائنات) ، من الضروري تنفيذ الميراث ، ولكن نظرًا لعدم وجود مفهوم للطبقة نفسها ، فإنها لن تنفذ الميراث من خلال فئات مثل لغة البرمجة الحقيقية الموجهة للكائنات ، ولكن يمكنها تنفيذ الميراث من خلال طرق أخرى. هناك العديد من الطرق لتنفيذ الميراث ، وما يلي مجرد عدد قليل منهم.
1. ميراث سلسلة النموذج الأولي
وظيفة person () {// تسمى الوظيفة الموروثة supertype (فئة الوالدين ، الفئة الأساسية) this.name = 'mumu' ؛ this.age = '18 '؛ } person.prototype.name = 'susu' ؛ // عندما يكون اسم السمة هو نفسه ، يجب أن تكون الأقرب ، والبحث في المثيل أولاً ، ولكن بعد ذلك انتقل إلى النموذج الأولي للعثور على عامل الوظائف () {// تسمى الوظيفة الموروثة نوعًا فرعيًا (الفئة الفرعية ، الفئة المشتقة) this.job = '' student '؛ } العامل. النمط النموذجي = شخص جديد () ؛ // الموروث من خلال سلسلة النموذج الأولي ، يتم تعيين مثيل الكائن الذي تم إنشاء مثيله بواسطة supertype إلى سمة النموذج الأولي لـ Subclass Var P2 = New Worker () ؛ console.log (p2.name) ؛ console.log (p2 مثيل كائن) ؛ // ترث جميع المنشئات من الكائنمفتاح تنفيذ الميراث أعلاه هو: Worker.Prototype = new person () ؛ اجعل العامل النموذج الأولي مثيلًا للشخص ويرثه من خلال سلسلة النموذج الأولي.
ملاحظة: عند استخدام سلاسل النموذج الأولي لتنفيذ الميراث ، لا يمكنك استخدام الحرفيات الكائنات لإنشاء طرق النموذج الأولي ، لأن هذا سيقطع العلاقة وإعادة كتابة سلسلة النموذج الأولي.
مشكلة ميراث سلسلة النموذج الأولي:
1.
وظيفة person () {this.bodys = ['eye' ، 'foot'] ؛ } وظيفة عامل () {} worker.prototype = new person () ؛ var p1 = New Worker () ؛ p1.bodys.push ('Hand') ؛ var p2 = عامل جديد () ؛ console.log (p1.bodys) ؛ console.log (p2.bodys) ؛2. عند إنشاء مثيلات من الأنواع الفرعية ، لا يمكن تمرير المعلمات في مُنشئات SuperType.
إذن كيف تحل مشكلتي سلسلة النموذج الأولي؟ ثم استمر في النظر إلى طريقة الميراث أدناه ~
2. ميراث مُنشئ الاقتراض (يسمى أيضًا انتحال شخصية الكائنات أو الكائن المزور أو الميراث الكلاسيكي)
وظيفة الشخص (الاسم ، العمر) {this.name = name ؛ this.age = العمر ؛ this.bodys = ['Eye' ، 'Foot'] ؛ } person.prototype.showname = function () {console.log (this.name) ؛ } عامل الوظيفة (الاسم ، العمر ، الوظيفة) {person.call (هذا ، الاسم ، العمر) ؛ this.job = Job ؛ // الفئة الفرعية إضافة سمات} var p1 = عامل جديد ('mumu' ، '18' ، 'student') ؛ p1.bodys.push ('Hand') ؛ var p2 = عامل جديد () ؛ console.log (p1.name) ؛ console.log (p2.bodys) ؛ console.log (p1.showname ()) ؛تحليل موجز للمبدأ أعلاه لاستخدام البنائين المستعرين: person.call (هذا ، الاسم ، العمر) ؛ يستدعي هذا الرمز مُنشئ الأصل ، ويرث السمة الأصل ، ويستخدم طريقة المكالمات للاتصال بمنشئ الشخص لتغيير هذا عند تنفيذ الوظيفة. هنا ، هذا-الجديد هو مُنشئ كائن العامل المتنكر: تمرير العامل إلى الشخص أعلاه.
عندما يتم وضع النوع المرجعي في المنشئ ، لن يتم مشاركته ، لذلك لا يتأثر P2.
إن استعارة طريقة وراثة المنشئ هنا يحل المشكلة التي لا يمكن لسلسلة النموذج الأولي اجتياز المعلمات ومشاركة أنواع المرجع.
نصائح: Call () وتطبيق () يمكن أن تغير طرق تنفيذ الوظيفة ، باختصار ، تغيير المحتوى المشار إليه بواسطة هذه الوظيفة.
كل من call () و application () قبول معلمتين: الأول هو نطاق الوظيفة التي تعمل فيه ، والآخر هو المعلمة التي تم تمريرها.
الفرق بين المكالمة والتطبيق هو الفرق في المعلمات.
يجب تعداد المعلمات في المكالمة واحدة تلو الأخرى.
يجب أن تكون المعلمات في التطبيق صفائف أو كائنات الوسائط
لذا فإن السؤال هو: لماذا نتيجة p1.showname () خاطئة؟ ---- لأن طريقة الميراث لمقاعد الاقتراض لا يمكن أن ترث سوى السمات والأساليب في المنشئ. هنا نجد أيضًا مشكلة في الاقتراض.
ملاحظة: نظرًا لأننا نضع جميع الطرق في المنشئ ، في كل مرة نستند إليها ، سنخصص مساحة للذاكرة لإهدار الموارد ، لذلك عادةً ما نضع الأساليب في النموذج الأولي والسمات في المنشئ.
مشكلة ميراث مُنشئ الاقتراض:
نظرًا لأن الاقتراض المُنشئ لا يمكن أن يرث سوى الخصائص والأساليب في المنشئ ، فإن الطرق المحددة في النموذج الأولي supertype غير مرئية للفئة الفرعية ، لذلك فهي تعادل عدم وجود نموذج أولي. نتيجة لذلك ، لا يمكن تعريف جميع الطرق إلا في المنشئ ، لذلك لا يوجد أي تعدد الوظائف.
فكيف تحل المشكلة الناجمة عن مقترضاء البنائين؟ ثم يعتمد على طريقة الميراث التالية
3. الجمع بين الميراث (ميراث كلاسيكي زائفة)
وظيفة الشخص (الاسم ، العمر) {this.name = name ؛ this.age = العمر ؛ } person.prototype.showname = function () {console.log (this.name) ؛ } عامل الوظيفة (الاسم ، العمر ، الوظيفة) {person.call (هذا ، الاسم ، العمر) ؛ // استعارة مُنشئ this.job = Job ؛ } worker.prototype = new person () ؛ // prototype سلسلة الميراث var p1 = عامل جديد ('mumu' ، '18' ، 'student') ؛ console.log (p1.age) ؛ p1.showname () ؛الجمع بين الميراث: الجمع بين سلسلة النموذج الأولي مع المنشئ المستعارة.
الفكرة: باستخدام سلسلة النموذج الأولي لتنفيذ ميراث السمات والأساليب على النموذج الأولي ، وباقتراض المنشئ لتنفيذ ميراث سمات المثيل
مثال أعلاه person.call (هذا ، الاسم ، العمر) ؛ يقترض المُنشئ لروث السمات
العامل. النمط النموذجي = شخص جديد () ؛ سلسلة النموذج الأولي ترث الطريقة ، وتجنب أوجه القصور في الاثنين ، وتجمع بين مزاياهما ، وتصبح نموذج الميراث الأكثر استخدامًا.
قضايا الميراث الجمع:
يسمى مُنشئ SuperType مرتين ، مرة واحدة عند إنشاء نموذج أولي من النوع الفرعي والمرة الأخرى داخل مُنشئ النوع الفرعي.
لحل هذه المشكلة ، يجب أن نستخدم الميراث الجمع الطفيلي.
4. النموذج الأولي الميراث
كائن الدالة (proto) {function f () {} f.prototype = proto ؛ إرجاع جديد f () ؛ } var person = {name: 'mumu' ، الأصدقاء: ['xiaxia' ، 'susu']} ؛ var otherperson = object (person) ؛ شخص آخر. var yetanotherperson = كائن (شخص) ؛ شخص آخر. console.log (person.friends) ؛ // ["xiaxia" ، "susu" ، "wen" ، "tian"] console.log (otherperson .__ proto __) // object {name: "mumu" ، friends: array [4]}تحليل موجز: كائن الوظيفة (proto) هو وظيفة ترحيل مؤقتة ، يمثل المعلمة proto فيه كائن يتم تمريره. مُنشئ F () هو كائن مؤقت تم إنشاؤه حديثًا ، والذي يستخدم لتخزين الكائن الذي تم تمريره. f.prototype = proto ؛ قم بتعيين مثيل الكائن إلى كائن النموذج الأولي لمؤسسة F ، وأخيراً إرجاع مثيل الكائن للكائن الذي تم تمريره. النموذج الأولي الميراث أو مشاركة سمات الأنواع المرجعية.
5. الميراث الطفيلي
// كائن دالة النقل المؤقت (proto) {function f () {} f.prototype = proto ؛ إرجاع جديد f () ؛ } // وظيفة الطفيليات إنشاء (proto) {var f = object (proto) ؛ f.love = function () {return this.name ؛ } إرجاع f ؛ } var person = {name: 'mumu' ، الأصدقاء: ['xiaxia' ، 'susu']} ؛ var otherperson = إنشاء (شخص) ؛ console.log (otherperson.love ()) ؛ الجمع الطفيلي الميراث6. الجمع الطفيلي الميراث
كائن الدالة (proto) {function f () {} f.prototype = proto ؛ إرجاع جديد f () ؛ } // وظيفة وظيفة الطفيليات إنشاء (شخص ، عامل) {var f = object (person.prototype) ؛ // إنشاء كائن f.constructor = عامل ؛ // اضبط مؤشر بناء النموذج الأولي وتعزيز الكائن عامل. this.age = العمر ؛ } person.prototype.showname = function () {console.log (this.name) ؛ } عامل الوظيفة (الاسم ، العمر ، الوظيفة) {person.call (هذا ، الاسم ، العمر) ؛ this.job = Job ؛ } إنشاء (شخص ، عامل) ؛ // مجموعة من الميراث var p1 = شخص جديد ('mumu' ، '18' ، 'student') ؛ p1.showname () ؛هذه الطريقة هي أيضًا الطريقة الأكثر مثالية ومثالية لتنفيذ أساليب الميراث الآن.
إن ملاحظات التعلم الميراث JavaScript أعلاه [يجب أن تقرأ للمبتدئين] هي كل المحتوى المشترك من قبل المحرر. آمل أن يعطيك مرجعًا وآمل أن تتمكن من دعم wulin.com أكثر.