تستخدم JavaScript الميراث النموذجي افتراضيًا. على الرغم من عدم وجود مفهوم للفئة، إلا أن وظيفتها يمكن أن تكون بمثابة مُنشئ. يمكن للمنشئ المدمج مع هذا والجديد إنشاء فئة تشبه Java. لذلك، يمكن لـ JavaScript محاكاة الوراثة المستندة إلى الفصل من خلال توسيع نفسها.
تستخدم JavaScript، مثل اللغات الأخرى الموجهة للكائنات، مراجع لأنواع الكائنات. المتغير الذي يحمل الكائن هو مجرد عنوان، في حين أن بيانات النوع الأساسي هي القيمة. عند تخزين الكائنات على النماذج الأولية، يمكن أن يكون هناك بعض المخاطر.
لننظر إلى المثال الأول أولاً
انسخ رمز الكود كما يلي:
فار إنشاء = وظيفة () {
الدالة الجبهة الوطنية () {}
وظيفة الإرجاع (الأصل) {
Fn.prototype = الأصل
إرجاع الجبهة الوطنية الجديدة
}
}()
فار الأصل = {
الاسم: "جاك"،
العمر: 30,
متزوج: كاذب
}
فار الطفل = إنشاء (الوالد)
console.log(الطفل)
تنفذ وظيفة أداة الإنشاء وراثة النموذج الأولي في كل مرة يتم فيها استدعاء الإنشاء، سيتم نسخ كائن جديد بناءً على الكائن الأصلي. هنا لدى الأصل ثلاث سمات، كلها أنواع بيانات أساسية: السلسلة والرقم والمنطقية.
الآن قم بتعديل الطفل لمعرفة ما إذا كان سيؤثر على الوالد.
انسخ رمز الكود كما يلي:
اسم الطفل = "زنبق"
عمر الطفل = 20،
Child.isMarried = صحيح
console.log(الطفل)
console.log (الوالد)
النتائج هي كما يلي
أي أن تعديل الطفل لن يؤثر على الوالد.
دعونا ننظر إلى مثال آخر
انسخ رمز الكود كما يلي:
فار إنشاء = وظيفة () {
الدالة الجبهة الوطنية () {}
وظيفة الإرجاع (الأصل) {
Fn.prototype = الأصل
إرجاع الجبهة الوطنية الجديدة
}
}()
فار الأصل = {
بيانات: {
الاسم: "جاك"،
العمر: 30,
متزوج: كاذب
},
اللغة: ["جافا"]
}
فار الطفل = إنشاء (الوالد)
Child.data.name = 'زنبق'
بيانات الطفل.العمر = 20
Child.data.isMarried = صحيح
Child.language.push('جافا سكريبت')
console.dir(الطفل)
console.dir(الوالد)
لاحظ أن سمتي الأصل هنا، البيانات واللغة، كلاهما نوعان مرجعيان، أحدهما كائن والآخر عبارة عن مصفوفة. لا يزال الطفل يرث من الوالد، ثم يتم تعديل الطفل وتكون النتائج كما يلي
كما ترون، تم تعديل الوالد أيضًا في هذا الوقت، واسم الطفل وعمره وما إلى ذلك هو نفسه. هذا شيء يجب أن تكون على دراية به عند استخدام الميراث النموذجي.
أفضل طريقة لاستخدام الميراث هي:
1. تعتمد سمات البيانات وراثة الفئة (معلقًا على هذا)، بحيث يمكن تكوينها أيضًا من خلال المعلمات عندما تكون جديدة
2. تعتمد الطريقة الوراثة النموذجية، والتي يمكن أن توفر الذاكرة، وفي الوقت نفسه، لن يؤثر تجاوز الأساليب بواسطة الفئات الفرعية على الفئة الأصلية.
فيما يلي وظيفة أداة الكتابة التي تلبي النقطتين المذكورتين أعلاه.
انسخ رمز الكود كما يلي:
/**
* @param {String} اسم الفئة
* @param {String/Function} superCls
* مصنعparam {Function}.
*/
الدالة $class(name, superClass, Factory) {
if (superClass === '') superClass = Object
وظيفة كلاز () {
إذا (نوع this.init === 'وظيفة') {
this.init.apply(هذا، الحجج)
}
}
var p = clazz.prototype = superCls جديدة
clazz.prototype.constructor = clazz
clazz.prototype.className = className
var supr = superCls.prototype
window[className] = clazz
Factory.call(ع، سوبر)
}
عند وضع نوع كائن على النموذج الأولي للفئة الأصلية، كن حذرًا عندما تقوم الفئات الفرعية بتعديله. في هذه الحالة، سيتم تعديل كافة مثيلات الفئات الفرعية التي ترث من الفئة الأصلية. ومن الصعب جدًا العثور على الأخطاء الناتجة عن ذلك.
تمت إضافة واجهة برمجة تطبيقات جديدة إلى ES5 لتنفيذ الميراث النموذجي: Object.create. يمكنك استخدامه لتحل محل وظيفة الإنشاء ذاتية التنفيذ أعلاه، على النحو التالي
انسخ رمز الكود كما يلي:
فار الأصل = {
الاسم: "جاك"،
العمر: 30,
متزوج: كاذب
}
فار الطفل = Object.create(الوالد)
console.log(الطفل)