يمكن تقسيم الوراثة في JS إلى نوعين: انتحال كائن وتسلسل النموذج الأولي.
1. يتضمن انتحال شخصية الكائن ثلاثة أنواع : طريقة السمة المؤقتة، وطريقة الاتصال () وطريقة التطبيق ().
1. طريقة السمة المؤقتة
انسخ رمز الكود كما يلي:
وظيفة الشخص (الاسم) {
this.name = name;
this.say = function(){
تنبيه ("اسمي" + this.name)؛
}
}
الدالة F2E(الاسم،المعرف){
this.temp = Person;
this.temp(name);
حذف this.temp;
this.id = id;
this.showId = function(){
تنبيه ("صباح الخير، سيدي، رقم عملي هو" +this.id)؛
}
}
فار سيمون = new F2E('Simon',9527);
simon.say();
simon.showId();
2.طريقة الاتصال ()/تطبيق ().
بشكل أساسي، يقوم بتغيير مؤشر هذا المؤشر.
انسخ رمز الكود كما يلي:
وظيفة الشخص (الاسم) {
this.name = name;
this.say = function(){
تنبيه ("اسمي" + this.name)؛
}
}
الدالة F2E(الاسم،المعرف){
تم تغيير طريقة Person.call(this,name); //apply() إلى Person.apply(this,new Array(name));
this.id = id;
this.showId = function(){
تنبيه ("صباح الخير، سيدي، رقم عملي هو" +this.id)؛
}
}
فار سيمون = new F2E('Simon',9527);
simon.say();
simon.showId();
العيوب: دعونا نلقي نظرة أولاً على مخطط تخصيص الذاكرة هذا:
في مفهوم OO، بعد إنشاء مثيل جديد، يشكل الكائن مساحة خاصة به في ذاكرة الكومة. ومن الجدير بالذكر أن مقطع التعليمات البرمجية هذا. توجد أساليب الأعضاء في مقطع التعليمات البرمجية هذا، ويتم مشاركة الأساليب. تكمن المشكلة هنا. ومن خلال انتحال كائن، لا يمكن وراثة المتغيرات والأساليب المحددة من خلال النموذج الأولي، على سبيل المثال، سوف يتسبب الكود التالي في حدوث خطأ:
انسخ رمز الكود كما يلي:
وظيفة الشخص (الاسم) {
this.name = name;
this.say = function(){
تنبيه ("اسمي" + this.name)؛
}
}
Person.prototype.age = 20;
Person.prototype.sayAge = function(){alert('عمري هو '+this.age)};
الدالة F2E(الاسم،المعرف){
Person.apply(this,new Array(name));
this.id = id;
this.showId = function(){
تنبيه ("صباح الخير، سيدي، رقم عملي هو" +this.id)؛
}
}
فار سيمون = new F2E('Simon',9527);
simon.sayAge(); // خطأ TypeError: simon.sayAge ليس دالة
2. طريقة السلسلة النموذجية
انسخ رمز الكود كما يلي:
وظيفة الشخص () {
this.name = 'سيمون';
}
Person.prototype.say = function(){
تنبيه ("اسمي" + this.name)؛
}
وظيفة F2E (معرف) {
this.id = id;
this.showId = function(){
تنبيه ("صباح الخير، سيدي، رقم عملي هو" +this.id)؛
}
}
F2E.prototype = new Person();
فار سيمون = جديد F2E(9527);
simon.say();
simon.showId();
تنبيه (simon.hasOwnProperty ('id'))؛ // تحقق مما إذا كانت ملكية خاصة به
بعد ذلك، اتبع المثال أعلاه لفهم مفاهيم سلسلة نماذج js التالية:
يمكن فهم سلسلة النموذج الأولي على النحو التالي: كل كائن في js له سمة __proto__ مخفية. تشير سمة __proto__ للكائن الذي تم إنشاء مثيل له إلى طريقة النموذج الأولي لفئته، ويمكن تعيين طريقة النموذج الأولي هذه إلى كائن آخر، وهو __proto__ يحتاج هذا الكائن إلى الإشارة إلى فئته، وبالتالي تشكيل سلسلة، وهي
انسخ رمز الكود كما يلي:
F2E.prototype = شخص جديد ()
هذه الجملة هي المفتاح. عندما يقرأ كائن JS سمة معينة، فإنه سيبحث أولاً عن سماته الخاصة، وإذا لم تكن هناك سمات، فسوف يبحث بعد ذلك عن سمات الكائن في سلسلة النموذج الأولي. بمعنى آخر، يمكن مشاركة أساليب سلسلة النموذج الأولي، مما يحل مشكلة انتحال صفة الكائن وإهدار الذاكرة.
الآن دعونا نتحدث عن العيوب:
العيب واضح. وراثة سلسلة النموذج الأولي تعني أنه لا يمكن تمرير المعلمات إلى الفئة الأصلية عند إنشاء فئة فرعية، ولهذا السبب لا تحتوي الدالة Person() في هذا المثال على معلمات ويتم كتابتها مباشرة باسم this.name="Simon". لن يحقق الكود التالي التأثير المطلوب:
انسخ رمز الكود كما يلي:
وظيفة الشخص (الاسم) {
this.name = name;
}
Person.prototype.say = function(){
تنبيه ("اسمي" + this.name)؛
}
الدالة F2E(الاسم،المعرف){
this.id = id;
this.showId = function(){
تنبيه ("صباح الخير، سيدي، رقم عملي هو" +this.id)؛
}
}
F2E.prototype = new Person();
var simon = new F2E("Simon",9527);
simon.say();
simon.showId();
وظيفة الشخص (الاسم) {
this.name = name;
}
Person.prototype.say = function(){
تنبيه ("اسمي" + this.name)؛
}
الدالة F2E(الاسم،المعرف){
this.id = id;
this.showId = function(){
تنبيه ("صباح الخير، سيدي، رقم عملي هو" +this.id)؛
}
}
F2E.prototype = new Person(); // لا يمكن تمرير القيمة هنا، ولن يعمل هذا. الاسم ولا الاسم. من الممكن كتابة F2E.prototype = new Person('wood') مباشرة، ولكن في هذه الحالة simon. say() يصبح اسمي خشب
var simon = new F2E("Simon",9527);
simon.say(); // منبثق اسمي غير محدد
simon.showId();
أخيرًا، اسمحوا لي أن ألخص ما أعتقد أنه طريقة أفضل لتنفيذ الميراث، حيث تستخدم متغيرات الأعضاء انتحال هوية الكائنات، وتستخدم أساليب الأعضاء تسلسل النموذج الأولي، كما يلي:
انسخ رمز الكود كما يلي:
وظيفة الشخص (الاسم) {
this.name = name;
}
Person.prototype.say = function(){
تنبيه ("اسمي" + this.name)؛
}
الدالة F2E(الاسم،المعرف){
Person.call(this,name);
this.id = id;
}
F2E.prototype = new Person();
// لاحظ تفصيلًا واحدًا هنا، لا يمكن كتابة showId أمام F2E.prototype = new Person();
F2E.prototype.showId = function(){
تنبيه ("صباح الخير، سيدي، رقم عملي هو" +this.id)؛
}
var simon = new F2E("Simon",9527);
simon.say();
simon.showId();