قبل بدء الرمز ، يجب أن تفهم بوضوح الغرض من الميراث وما هي الفوائد التي يمكن أن تجلبها. بشكل عام ، عند تصميم الفصل ، نأمل في تقليل التعليمات البرمجية المكررة وإضعاف الاقتران بين الفئات. من الصعب الاعتناء بكليهما. وفقًا لفهمنا لميراث لغة الوجه -إلى الكائن ، فإن الميراث سيؤدي إلى اقتران قوي مباشر ، ولكن نظرًا لمرونته الفريدة ، يمكن لـ JS تصميم اقتران قوي وضعف اقتران ضعيف وكفاءة عالية ورمز غير فعال. وما تستخدمه يعتمد على الموقف.
يوفر ما يلي ثلاث طرق للميراث في JS: الميراث الطبقي ، وميراث النموذج الأولي ، والخلط. فيما يلي وصف موجز لميراث الفصل.
شكل فئة الميراث.
يعتمد تحقيق ميراث نوع JS على سلسلة النموذج الأولي. ما هي السلسلة الأصلية؟ الكائن في JS لديه prottive السمة.
يبدو أن لديها انطباعًا عن النموذج الأولي.
نسخ رمز رمز على النحو التالي:
var person = function () {
this.name = "liyatang" ؛
} ؛
person.prototype = {
// يمكنك توفير الوظيفة الأساسية للشخص هنا
getName: function () {
إرجاع هذا.
}
}
نضع الوظيفة الأساسية للفئة في خاصية النموذج الأولي ، مما يشير إلى أن مرجع كائن الشخص له وظيفة XXX.
بعد فهم النموذج الأولي ، تحتاج إلى فهم ماهية السلسلة الأصلية. عندما لا يتم رؤية العضو (السمة أو الطريقة) للكائن الزائر ، إذا لم يتم رؤية العضو في الكائن الحالي ، فسيجد JS في الكائن المشار إليه في سمة النموذج الأولي. إذا لم يتم العثور عليها ، فسوف يعود إلى غير محدد.
فما هي المطالبات التي تعطينا السلسلة الأصلية؟ من السهل التفكير في أن السلسلة الأولية تعني السماح لصف فئة أخرى. هذا يربط أعضاء الفئة الأصل بالفصول الفرعية ، لأنهم سيجدون فئة الوالدين عندما لا يتم العثور عليهم على الفئة الفرعية. (الفقرتين أعلاه من الكلمات ليست صارمة ، موصوفة فقط بكلمات سهلة الفهم)
نحتاج أدناه إلى فصل صيني ، ونحن بحاجة إلى أن نرث الأسماء وأعضاء الاسم في فئة الشخص.
نسخ رمز رمز على النحو التالي:
var inchinese = function (name ، nation)
// الميراث ، تحتاج إلى استدعاء مُنشئ الفئة الأصل ، يمكنك الاتصال به باستخدام المكالمة ، هذه النقطة إلى الصينية
// يمكن للشخص الاتصال بأعضاء الشخص في هذا النطاق
person.call (هذا ، الاسم) ؛
this.nation = الوطني ؛
} ؛
النمط الصيني.
// ليس هو نفسه كما كان من قبل ، لأن سمة النموذج الأولي مغطى
//chinese.prototype = {
// getNation: function () {{
// إرجاع هذا.
//}
//} ؛
// ستحتاج الطريق في المستقبل إلى إضافة هكذا
صيني.
إرجاع هذا.
} ؛
تم إنشاء علاقة الميراث ، نسميها هكذا
نسخ رمز رمز على النحو التالي:
var c = صيني جديد ("liyatang" ، "الصين") ؛
تنبيه (C.GetName ()) ؛
لذلك اكتمل الميراث من النوع. هل تم إنجازه حقًا؟
وذلك لأن النموذج الصيني أعلاه = profote.prototype ؛ لا يتم التسامح مع هذا في حد ذاته ، وليس التأثير الذي نريده.
يمكننا إضعاف الاقتران في كائن أو مثيل آخر.
نسخ رمز رمز على النحو التالي:
//
//chinese.prototype = new person () ؛
// النوع الثاني
// var f = function () {} ؛
//f.prototype = person.prototype ؛
//chinese.prototype = f.prototype ؛
ما هي الاختلافات بين هاتين الطريقتين؟ أضف وظيفة فارغة f في النوع الثاني ، والتي يمكن أن تتجنب مثيلًا لإنشاء فئة الأصل ، لأن الفئة الأصل قد تكون كبيرة ، وستكون وظيفة بنية الطبقة الأصل بعض الآثار الجانبية ، أو عدد كبير من العمليات الحسابية سيتم تنفيذها. لذلك أوصي بالطريقة الثانية.
في هذه المرحلة ، انتهى الأمر ، ليس بعد! هناك سمات لسمات سمات الكائن ، والتي تحافظ على إشارة إلى وظيفة مثيل كائن معين. وفقًا لهذا البيان ، يجب أن يكون chiese.prototype.
عندما تم إنشاء سلسلة النموذج الأولي لـ Chiese قبل الذكريات ، قمنا بتغطية النمط. لذلك في هذا الوقت ، chiese.prototype.constructor هو شخص. نحتاج أيضًا إلى إضافة الرمز التالي
نسخ رمز رمز على النحو التالي:
// ليست هناك حاجة للتحقيق في الظروف هنا ، مع العلم الصيني.
if (inchane.prototype.constructor == object.prototype.constructor) {
الصينية. النموذج النموذجي.
}
تتحول إلى الكود بأكمله على النحو التالي
نسخ رمز رمز على النحو التالي:
var person = function (name) {
this.name = name ؛
} ؛
person.prototype = {
getName: function () {
إرجاع هذا.
}
} ؛
var inchinese = function (name ، nation)
person.call (هذا ، الاسم) ؛
this.nation = الوطني ؛
} ؛
var f = function () {} ؛
f.prototype = person.prototype ؛
النمط الصيني.
if (inchane.prototype.constructor == object.prototype.constructor) {
الصينية. النموذج النموذجي.
}
صيني.
إرجاع هذا.
} ؛
var c = صيني جديد ("liyatang" ، "الصين") ؛
ALERT (C.GetName ()) ؛
إذا تمكنت من وضع رمز الميراث في وظيفة ، فمن المريح إعادة استخدام الكود ، والفرز الأخير هو على النحو التالي
نسخ رمز رمز على النحو التالي:
تمتد الوظيفة (الفئة الفرعية ، الفئة الفائقة) {{
var f = function () {} ؛
f.prototype = superclass.prototype ؛
subcleass.prototype = new f () ؛
subcleass.prototype.constructor = فئة فرعية ؛
Subcleass.SuperClass = Superclass.Protype ؛
if (superclass.prototype.constructor == object.prototype.constructor) {
superclass.prototype.constructor = فائق الفئة ؛
}
}
var person = function (name) {
this.name = name ؛
} ؛
person.prototype = {
getName: function () {
إرجاع هذا.
}
} ؛
var inchinese = function (name ، nation)
person.call (هذا ، الاسم) ؛
this.nation = الوطني ؛
} ؛
تمتد (الصينية ، شخص) ؛
صيني.
إرجاع هذا.
} ؛
var c = صيني جديد ("liyatang" ، "الصين") ؛
ALERT (C.GetName ()) ؛
تعديل بعد النشر:
تحت التعليقات على الطابق الأول ، لدي رؤية جديدة لتلك الوظيفة الممتدة. تم اقتراح طريقتين عند مناقشة كيفية ضبط السلسلة الأصلية
نسخ رمز رمز على النحو التالي:
//
//chinese.prototype = new person () ؛
// النوع الثاني
// var f = function () {} ؛
//f.prototype = person.prototype ؛
//chinese.prototype = f.prototype ؛
على الرغم من أن الطريقة الثانية لتقليل وظيفة البناء للفئة الأصل ، إلا أن الشخص (هذا ، الاسم) يستخدم عند تصميم الفصل الصيني ؛
ومع ذلك ، في الطريقة الأولى ، يمكنك تقليل الشخص (هذا ، الاسم) باللغة الصينية ؛ قد ترغب في وضع رمز الوظيفة هذا في تمديد. فقط اكتب
النمط الصيني = شخص جديد () ؛
لكن النسيان هو أن النمط الصيني. الجواب خاطئ! من الواضح أن الشخص الجديد () يحتاج إلى تمرير معلمة الاسم. لا يمكننا القيام بهذا الجزء من وظيفة التمديد ، لذلك يتعين علينا استدعاء مُنشئ الأصل -فصول في الفصل الصيني. هذا أيضًا يتماشى مع الأفكار الموجهة نحو الكائن.
لذلك ، لا يزال يوصى باستخدام الطريقة الثانية.
في المرة الأولى التي كتبت فيها عن المقالات الفنية بهذه الطريقة ، يتم رصفها وفقًا لتفكيري.