يقدم
أي برمجة تقترح إعادة استخدام الكود. خلاف ذلك ، إذا كنت بحاجة إلى كتابة برنامج جديد في كل مرة تقوم فيها بتطوير برنامج جديد أو كتابة وظيفة جديدة ، فسيكون ذلك بمثابة مضيعة. ومع ذلك ، فإن إعادة استخدام التعليمات البرمجية جيدة أو سيئة أيضًا. في المادتين التاليتين ، سنناقش إعادة استخدام الكود. تتجنب المقالة الأولى استخدام هذه الأنماط قدر الإمكان ، لأنها تجلب بعض المشكلات إلى حد أكبر أو أقل ؛ الصف الثاني هو التوصية ، التي تشير إلى النمط الموصى به الذي يستخدمه الجميع ، ولن تكون هناك أي مشاكل عمومًا.
الوضع 1: الوضع الافتراضي
غالبًا ما تكون هناك مشكلة في إعادة استخدام التعليمات البرمجية للوضع الافتراضي الذي يستخدمه الجميع بشكل شائع. يستخدم هذا الوضع مُنشئ Parent () لإنشاء كائن وتعيين الكائن إلى النموذج الأولي للطفل (). دعونا نلقي نظرة على الكود:
نسخة الكود كما يلي:
وظيفة الوراثة (c ، p) {
C.Prototype = جديد p () ؛
}
// مُنشئ الوالدين
وظيفة الوالد (الاسم) {
this.name = name || "آدم" ؛
}
// أضف وظيفة say إلى النموذج الأولي
parent.prototype.say = function () {
إرجاع هذا.
} ؛
// مُنشئ الطفل فارغ
وظيفة الطفل (الاسم) {
}
// تنفيذ الميراث
وراثة (طفل ، والد) ؛
var kid = New Child () ؛
console.log (kid.say ()) ؛ // "آدم"
var kiddo = New Child () ؛
kiddo.name = "باتريك" ؛
console.log (kiddo.say ()) ؛ // "باتريك"
// العيوب: لا يمكنك نقل المعلمات إلى مُنشئ الطفل
var s = طفل جديد ('seth') ؛
console.log (s.say ()) ؛ // "آدم"
عيب هذا الوضع هو أن الطفل لا يمكنه تمرير المعلمات ، وهو أمر غير مجدي بشكل أساسي.
النمط 2: مُنشئ الاقتراض
هذا النمط هو أن الطفل يستعير مُنشئ الوالد للتطبيق ، ثم يمرر هذا الطفل والمعلمات إلى طريقة تطبيق:
نسخة الكود كما يلي:
// مُنشئ الوالدين
وظيفة الوالد (الاسم) {
this.name = name || "آدم" ؛
}
// أضف وظيفة say إلى النموذج الأولي
parent.prototype.say = function () {
إرجاع هذا.
} ؛
// مُنشئ الطفل
وظيفة الطفل (الاسم) {
parent.apply (هذا ، الحجج) ؛
}
var kid = طفل جديد ("باتريك") ؛
console.log (kid.name) ؛ // "باتريك"
// العيوب: طريقة القول ليست موروثة من المنشئ
console.log (typeof kid.say) ؛ // "غير محدد"
العيب واضح أيضًا ، وأسلوب القول غير متوفر لأنه لم يتم مورثه.
النمط 3: استعارة المنشئ وضبط النموذج الأولي
الوضعان أعلاه لهما أوجه القصور الخاصة بهما ، فكيف لإزالة أوجه القصور لكليهما؟ دعنا نحاول:
نسخة الكود كما يلي:
// مُنشئ الوالدين
وظيفة الوالد (الاسم) {
this.name = name || "آدم" ؛
}
// أضف وظيفة say إلى النموذج الأولي
parent.prototype.say = function () {
إرجاع هذا.
} ؛
// مُنشئ الطفل
وظيفة الطفل (الاسم) {
parent.apply (هذا ، الحجج) ؛
}
child.prototype = new Parent () ؛
var kid = طفل جديد ("باتريك") ؛
console.log (kid.name) ؛ // "باتريك"
console.log (typeof kid.say) ؛ // وظيفة
console.log (kid.say ()) ؛ // باتريك
console.dir (طفل) ؛
حذف kid.name ؛
console.log (kid.say ()) ؛ // "آدم"
عندما يتم تشغيله ، يكون كل شيء طبيعيًا ، لكن هل لاحظت أن مُنشئ الوالدين قد تم تنفيذه مرتين ، لذلك على الرغم من أن البرنامج متاح ، إلا أنه غير فعال للغاية.
الوضع 4: النموذج الأولي المشترك
النموذج الأولي المشترك يعني أن الطفل والوالد يستخدمان نفس النموذج الأولي ، فإن الكود كما يلي:
نسخة الكود كما يلي:
وظيفة الوراثة (c ، p) {
C.Prototype = p.prototype ؛
}
// مُنشئ الوالدين
وظيفة الوالد (الاسم) {
this.name = name || "آدم" ؛
}
// أضف وظيفة say إلى النموذج الأولي
parent.prototype.say = function () {
إرجاع هذا.
} ؛
// مُنشئ الطفل
وظيفة الطفل (الاسم) {
}
وراثة (طفل ، والد) ؛
var Kid = New Child ('Patrick') ؛
console.log (kid.name) ؛ // غير محدد
console.log (typeof kid.say) ؛ // وظيفة
kid.name = 'patrick' ؛
console.log (kid.say ()) ؛ // باتريك
console.dir (طفل) ؛
من المؤكد أن الشيء نفسه صحيح ، لا يتم تلقي معلمات الطفل بشكل صحيح.
النمط 5: مُنشئ مؤقت
أولاً ، استعارة المُنشئ ، ثم اضبط النموذج الأولي للطفل على مثيل للمُنشئ المستعارة ، وأخيراً استعادة مُنشئ النموذج الأولي للطفل. الرمز كما يلي:
نسخة الكود كما يلي:
/* إنهاء*/
var errinit = (function () {
var f = function () {
} ؛
وظيفة الإرجاع (C ، P) {
f.prototype = p.prototype ؛
C.Prototype = جديد f () ؛
C.Uber = p.prototype ؛
c.prototype.constructor = c ؛
}
} ()) ؛
وظيفة الوالد (الاسم) {
this.name = name || "آدم" ؛
}
// أضف وظيفة say إلى النموذج الأولي
parent.prototype.say = function () {
إرجاع هذا.
} ؛
// مُنشئ الطفل
وظيفة الطفل (الاسم) {
}
وراثة (طفل ، والد) ؛
var kid = New Child () ؛
console.log (kid.name) ؛ // غير محدد
console.log (typeof kid.say) ؛ // وظيفة
kid.name = 'patrick' ؛
console.log (kid.say ()) ؛ // باتريك
var kid2 = طفل جديد ("توم") ؛
console.log (kid.say ()) ؛
console.log (kid.constructor.name) ؛ // طفل
console.log (kid.constructor === parent) ؛ // خطأ شنيع
المشكلة لا تزال هي نفسها ، لا يمكن للطفل تلقي المعلمات بشكل طبيعي.
الوضع 6: كلاس
لنبدأ بالرمز لهذا النمط:
نسخة الكود كما يلي:
var klass = function (parent ، props) {
var child ، f ، i ؛
// 1.
// مُنشئ جديد
طفل = دالة () {
if (child.uber && child.uber.hasownproperty ("__ bustruct")) {
child.uber .__ build.apply (هذا ، الحجج) ؛
}
if (child.protype.hasownproperty ("__ build")) {
child.prototype .__ construct.apply (هذا ، الحجج) ؛
}
} ؛
// 2.
// الميراث
الوالد = الوالد || هدف؛
f = function () {
} ؛
f.prototype = parent.prototype ؛
child.prototype = new f () ؛
child.uber = parent.prototype ؛
child.prototype.constructor = الطفل ؛
// 3.
// إضافة طريقة التنفيذ
ل (أنا في الدعائم) {
if (props.hasownproperty (i)) {
child.prototype [i] = الدعائم [i] ؛
}
}
// إرجاع "الفصل"
إعادة الطفل
} ؛
var man = klass (null ، {
__construct: وظيفة (ماذا) {
console.log ("مُنشئ الرجل") ؛
this.name = ماذا ؛
} ،
getName: function () {
إرجاع هذا.
}
}) ؛
var أولاً = رجل جديد ('آدم') ؛ // سجلات "مُنشئ الرجل"
First.getName () ؛ // "آدم"
var superman = klass (رجل ، {
__construct: وظيفة (ماذا) {
console.log ("Superman's Constructor") ؛
} ،
getName: function () {
var name = superman.uber.getName.call (هذا) ؛
إرجاع "أنا" + اسم ؛
}
}) ؛
var Clark = New Superman ('Clark Kent') ؛
clark.getName () ؛ // "أنا كلارك كينت"
console.log (clark extrealof man) ؛ // حقيقي
console.log (Clark extrealof superman) ؛ // حقيقي
ماذا عن ذلك؟ هل من دوار قليلا أن نرى؟ لكي تكون لطيفًا ، فإن القواعد والمواصفات لهذا النمط هي نفس اللغات الأخرى. هل أنت على استعداد لاستخدامه؟ سعال. . .
لخص
على الرغم من أن الأوضاع الستة المذكورة أعلاه تنفذ وظائف معينة في بعض الظروف الخاصة ، إلا أنها جميعها لديها أوجه القصور الخاصة بهم ، لذلك بشكل عام ، يجب على الجميع تجنب استخدامها.