يلخص هذا المقال استخدام جافا سكريبت على الميراث. شاركه للرجوع إليه. التفاصيل كما يلي:
مثال:
انسخ الرمز كما يلي:/**
* تنفيذ الفئات الفرعية ترث فئة الأصل ، ولكن لا تولد خصائص وطرق غير ضرورية
* returns {function}
*/
define (function () {
وظيفة الإرجاع (النوع الفرعي ، supertype) {
var proto = كائن جديد (supertype.prototype) ؛
proto.constructor = النوع الفرعي ؛
النوع الفرعي. النموذج = proto ؛
} ؛
}) ؛
.
define (function () {
وظيفة النبذ (s)
{
this.str = s ؛
this.length = this.str.length ؛
}
ostring.prototype.show = function () {
تنبيه (this.str) ؛
} ؛
إرجاع النبذ.
}) ؛
.
DEFINE (['RERNIT' ، 'OSTRING'] ، function (الوراثة ، النبذ) {
وظيفة wstring (s) {
// استخدم استدعاء إلى مُنشئ الفئة الأصل
ostring.call (هذا ، s) ؛
this.chlength = 2 * s.length ؛
}
// ورث سمات أخرى
ورث (wstring ، البذرة) ؛
wstring.prototype.add = دالة (w)
{
تنبيه (this.str + w) ؛
} ؛
إرجاع wstring.
}) ؛
انظر إلى المثال مرة أخرى
1. استخدم الوظيفة للتنفيذ:
انسخ الرمز كما يلي: وظيفة الشخص (الاسم) {
this.name = name ؛
}
person.prototype.getName = function () {
إرجاع هذا.
}
مؤلف الوظيفة (الاسم ، الكتب) {
this.inherit = شخص ؛
this.inherit (الاسم) ؛
this.books = كتب ؛
}
var au = مؤلف جديد ("Dororo" ، "تعلم الكثير") ؛
au.name
أو ما يعادل:
انسخ الرمز كما يلي: وظيفة الشخص (الاسم) {
this.name = name ؛
}
person.prototype.getName = function () {
إرجاع هذا.
}
مؤلف الوظيفة (الاسم ، الكتب) {
person.call (هذا ، الاسم) ؛
this.books = كتب ؛
}
var au = مؤلف جديد ("Dororo" ، "تعلم الكثير") ؛
Au.GetName
نظرًا لأن هذا يأخذ هذا فقط كمعلمة ، واتصل بمنشئ شخص الفئة الأصل وتعيين جميع المجالات المخصصة للفئة الأصل إلى الفئة الفرعية للمؤلف ، فلن يتم توريث أي مجالات محددة خارج مُنشئ الشخص الأصل. لذلك في المثال أعلاه ، لن يتم تعريف au.getName (غير محدد) لأن GetName محدد في كائن النموذج الأولي للشخص.
علاوة على ذلك ، يجب على مُنشئ الفئة الفرعية استدعاء مُنشئ الفئة الأصل قبل تحديد نطاقه الخاص ، حتى لا يكتب تعريف الفئة الفرعية من قبل الفئة الفرعية. بمعنى آخر ، يحدد المؤلف كتاب الممتلكات بعد الشخص. في الوقت نفسه ، من الأفضل عدم استخدام النموذج الأولي لتحديد مجال وظيفة الفئة الفرعية في الفئات الفرعية ، لأنه بعد أن تكون الفئة الفرعية جديدة ومثليفة ، يجب تنفيذ النموذج الأولي ، ثم يطلق على مُنشئ الفئة الأم ، والتي يسهل الكتابة عليها أيضًا من قبل الفئة الوالدين.
2. استخدم النموذج الأولي لتنفيذ:
انسخ الرمز كما يلي: وظيفة الشخص (الاسم) {
this.name = name ؛
}
person.prototype.getName = function () {
إرجاع هذا.
}
مؤلف الوظيفة (الاسم ، الكتب) {
this.books = كتب ؛
}
uptor.prototype = شخص جديد (اسم) ؛
المؤلف.
uplor.prototype.getbooks = function ()
إرجاع this.books ؛
}
var au1 = مؤلف جديد ("dororo1" ، "تعلم الكثير") ؛
var au2 = مؤلف جديد ("dororo2" ، "تعلم أقل") ؛
تنبيه (au1.getName ()) ؛
ALERT (AU2.GETNAME ()) ؛
تتجنب هذه الطريقة المشكلة التي لا يمكن موروثة النموذج الأولي في تنفيذ الوظيفة. لأن uptor.prototype = شخص جديد (اسم) ؛ شخص جديد () سوف يستدعي جميع خصائص بناء الشخص والنموذج الأولي. ولكن العيب هو أن النموذج uptor.protisted تم إنشاء مثيل له. لذلك عندما يتم إنشاء فئات فرعية ، فإن جميع أنواع البيانات غير القاعدية هي نسخ مرجعية. لذلك في المثال أعلاه ، يتم إرجاع القيمة التي يتم إرجاعها عن طريق AU1 أو AU2 هي Dororo1.
3. استخدم "الهجين" لتحقيقه
انسخ الرمز كما يلي: وظيفة الشخص (الاسم) {
this.name = name ؛
}
person.prototype.getName = function () {
إرجاع هذا.
}
مؤلف الوظيفة (الاسم ، الكتب) {
this.base = شخص جديد (الاسم) ؛
لـ (VAR Key in this.base) {
إذا (! هذا [المفتاح]) {
هذا [key] = this.base [key] ؛
}
}
this.book = كتب ؛
}
var au1 = مؤلف جديد ("dororo1" ، "العمل") ؛
var au2 = مؤلف جديد ("dororo2" ، "play") ؛
تنبيه (au1.getName ()) ؛
ALERT (AU2.GETNAME ()) ؛
au1.book ؛
Au2.book ؛
إنه ينتمي إلى امتداد ، ونسخ جميع مجالات الفئة الأصل إلى فئة فرعية. لا توجد مشاكل في الجانبين أعلاه على الإطلاق.
وضع الجمع الطفيلي)
يتضمن ميراث JS وراثة السمات وميراث الأساليب ، والتي يتم تنفيذها من خلال طرق مختلفة.
1. ميراث السمات
يتم تحقيق ميراث السمات عن طريق تغيير بيئة تنفيذ الوظيفة. يمكن تنفيذ بيئة تنفيذ تغيير الوظيفة باستخدام طريقتين: CALL () وتطبيق ().
نقوم أولاً بإنشاء "فئة" حيوانية (لأنه لا يوجد مفهوم لفئة في JS ، إليك مجرد وهمية ، فهو في الواقع مجرد كائن وظيفة).
انسخ الرمز كما يلي: وظيفة Animal (typename) {
// إضافة اسم typename لبيئة تنفيذ الطريقة الحالية (هذا)
// ولكن يجب تنفيذ بيئة التنفيذ (هذا) قبل تحديدها
this.typename = typename ؛
this.colors = ["Red" ، "بينما"] ؛
}
// أريد إضافة طريقتين (مشتركين) إلى النموذج الأولي للوظيفة
animal.prototype.shout = function () {Alert ("i am: -" + this.typename) ؛} ؛
animal.prototype.eat = function () {Alert ("i am: -" + this.typename)} ؛
//-تحديد الأسد-"فئة" (في الواقع وظيفة)
وظيفة الأسد (tn) {
//-تنفيذ طريقة الحيوان وتعديل بيئة تنفيذ الحيوانات إلى هذا الأسد من خلال المعلمة الأولى للتطبيق
// وبالمثل ، يجب تنفيذ هذا الأسد لتحديد من هو
Animal.Apply (هذا ، ["Lion"]) ؛ //-يرث السمات المتغيرة للفئة الأصل ، وهذا لأنه أسد جديد ، هذا هو الأسد
}
Lion.Prototype = animal.prototype ؛ // ورث طريقة الفئة الأصل وإنهائها ، لكن هذا ليس مكتوبًا جيدًا. عندما تضيف فئة الطفل طريقة ، فإن فئة الوالدين لديها أيضًا هذه الطريقة. هذا مرجع مؤشر
Lion.prototype.hunt = function () {
تنبيه ("أنا: الأسد ، أريد أن أصطاد ~~ ・ ~") ؛
}
var aminm = new Animal () ؛
Aminm.hunt () ؛ // --- يمكنك الوصول إلى طريقة الفئة الفرعية ، وهي ليست جيدة
// ---- فكيف تحل هذه المشكلة؟ ؟ ؟ ؟ ؟ ؟
// --- الحل: يمكنك كتابة هذا عند ورث الطريقة:
Lion.Prototype = new Animal () ؛ // ورث طريقة الفئة الأصل وتعيين الكائن الحي إلى النموذج الأولي النموذجية. في الواقع ، لديها أيضا سمات فيه.
var lion = new Lion () ؛ // بالإضافة إلى إنشاء الكلمة الرئيسية الجديدة ، فإنه سيعدل أيضًا بيئة تنفيذ كائن الأسد إلى كائن الأسد نفسه
//-وبعبارة أخرى ، بعد الانتهاء من جديد ، هذا في وظيفة الأسد هي وظيفة الأسد نفسها ، ثم تسمى وظيفة الأسد
تحليل الكلمات الرئيسية الجديدة:
الكلمة الرئيسية الجديدة رائعة جدا. في الكود السابق ، تكمل الكلمة الرئيسية الجديدة المهام التالية:
1) افتح مساحة كومة للتحضير لتخزين كائنات الأسد
2) تعديل بيئة تنفيذ كائن الأسد نفسه بحيث تشير هذه وظيفة الأسد إلى كائن وظيفة الأسد نفسه.
3) استدعاء "مُنشئ" فئة الأسد "وإنشاء كائن الأسد
4) قم بتعيين عنوان كومة كائن دالة الأسد للمتغير L ، وفي هذا الوقت يشير L إلى كائن دالة الأسد
Lion.shout () ؛
Lion.eat () ؛
ومع ذلك ، فإن هذا الميراث له عيب: يسمى مُنشئ فئة الأصل مرتين ، واتصل مرة واحدة ، ثم جديدًا مرة أخرى.
آمل أن تكون هذه المقالة مفيدة لبرمجة JavaScript للجميع.