إعادة استخدام الكود ومبادئها
代码复用، كما يوحي الاسم ، هو إعادة استخدام جزء أو حتى جميع الكود الذي تمت كتابته لإنشاء برنامج جديد. عند الحديث عن إعادة استخدام الكود ، فإن أول شيء يمكن أن نفكر فيه هو继承性. مبدأ إعادة استخدام الكود هو:
优先使用对象组合,而不是类继承في JS ، نظرًا لعدم وجود مفهوم للطبقة ، فإن مفهوم الحالات ليس ذا معنى كبير. الكائنات في JS عبارة عن أزواج بسيطة ذات قيمة رئيسية يمكن إنشاؤها وتعديلها ديناميكيًا.
ولكن في js ، يمكننا إنشاء إنشاء كائن يستخدم المُنشئين والمشغلين new ، والذي يتكون من تشابه بناء الجملة مع لغات البرمجة الأخرى التي تستخدم الفصول.
على سبيل المثال:
var trigkit4 = new Person(); يبدو أن js عبارة عن فئة عند استدعاء Person مُنشئ ، لكنها في الواقع لا تزال وظيفة ، والتي تعطينا بعض أفكار التطوير وأنماط الميراث التي يُفترض أنها تستند إلى الفصل ، والتي يمكننا تسميتها "أنماط الميراث الكلاسيكية".
يتطلب نموذج الميراث التقليدي الكلمة الرئيسية class . نحن نفترض أن نموذج الميراث من الطبقة أعلاه هو现代继承模式، وهو نموذج لا يلزم النظر فيه بطريقة الفصل.
وضع الميراث الكلاسيكي
راجع مثالين التاليين من Parent() والطفل Child() :
<script type="text/javascript">وظيفة الوالد (الاسم) {
this.name = name || "ألين" ؛
}
parent.prototype.say = function () {
إرجاع هذا.
}
وظيفة الطفل (الاسم) {}
// قم بإنشاء كائن مع مُنشئ الأصل وقم بتعيين الكائن إلى النموذج الأولي للطفل لتحقيق الميراث
وظيفة الوراثة (c ، p) {
c.prototype = new p () ؛ // يجب أن تشير سمة النموذج الأولي إلى كائن ، وليس وظيفة
}
// استدعاء الوظيفة الموروثة المعلنة
وراثة (طفل ، والد) ؛
</script>
عند إنشاء كائن باستخدام بيان new Child() ، فإنه يحصل على وظائفه من Parent() من خلال النموذج الأولي ، مثل:
var kid = new Child();kid.say();//Allenسلسلة النموذج الأولي
دعونا نناقش كيف تعمل سلاسل النموذج الأولي في وضع الوراثة الصف. نفكر في الكائنات ككتل في مكان ما في الذاكرة التي تحتوي على بيانات ومراجع إلى كتل أخرى. عند إنشاء كائن باستخدام عبارة new Parent() ، سيتم إنشاء كتلة كهذه على يسار الشكل أدناه. هذه الكتلة تحفظ سمة name . إذا كنت ترغب في الوصول إلى طريقة say() ، فيمكننا الوصول إلى __proto__ Parent.prototype النمط النمط على اليمين من خلال الإشارة إلى سمة prototype Parent() .
إذن ، ماذا يحدث عند إنشاء كائن جديد مع var kid = new Child() ؟ كما هو مبين في الشكل أدناه:
الكائن الذي تم إنشاؤه باستخدام بيان new Child() شبه فارغ باستثناء الرابط الضمني __proto__ . في هذه الحالة ، يشير __proto__ إلى الكائن الذي تم إنشاؤه باستخدام عبارة new Parent() في وظيفة inherit()
عند تنفيذ kid.say() ، نظرًا لأن كائن الكتلة في الزاوية اليسرى السفلى لا يحتوي على طريقة say() ، فإنه سيستفسر عن كائن الكتلة الوسطى من خلال سلسلة النموذج الأولي. ومع ذلك ، لا يحتوي كائن الكتلة الوسطى أيضًا على طريقة say() ، لذلك يتبع سلسلة النموذج الأولي للاستعلام عن كائن الكتلة الأيمن ، ويحدث الكائن طريقة say() . هل انتهى؟
لم ينتهي التنفيذ هنا. تتم الإشارة إلى this.name في طريقة say() ، والتي تشير إلى الكائن الذي أنشأه المنشئ. هنا ، يشير إلى كتلة new Child() . ومع ذلك ، لا توجد سمة name في new Child() . لهذا السبب ، سيتم الاستعلام عن الكتلة المتوسطة ، ويحدث الكتلة الوسيطة أن لها سمة name . في هذه المرحلة ، تم الانتهاء من استعلام سلسلة النموذج الأولي.
لمزيد من المناقشة التفصيلية ، يرجى الاطلاع على مقالتي: ملاحظات تعلم JavaScript (5) شرح مفصل للنماذج الأولية وسلاسل النموذج الأولي
النموذج الأولي المشترك
قاعدة هذا النمط هي أنه ينبغي نقل الأعضاء القابل لإعادة الاستخدام إلى النموذج الأولي بدلاً من وضعه في هذا. لذلك ، لغرض الميراث ، ينبغي تنفيذ أي شيء يستحق الوراثة في النموذج الأولي. لذلك ، يمكنك تعيين النموذج الأولي للكائن الطفل والنموذج الأولي للكائن الأصل إلى نفس المثال أدناه:
function inherit(C,P){C.Prototype = p.prototype ؛
}
يشترك الكائن الفرعي والكائن الأصل في نفس النموذج الأولي ويمكنه الوصول إلى طريقة say() بالتساوي. ومع ذلك ، فإن الكائن الطفل لا يرث سمة name
النموذج الأولي الميراث
ميراث النموذج الأولي هو نموذج الميراث "الحديث" غير الطائفي. انظر المثال التالي:
<script type="text/javascript">// الكائن المراد موروثه
var parent = {
الاسم: "جاك" // لا يوجد فاصلة فاصلة هنا
} ؛
//新对象var child = object (parent) ؛
alert(child.name);//Jack</script>
في وضع النموذج الأولي ، ليس من الضروري استخدام الكائنات الحرفية لإنشاء كائنات أولية. كما هو موضح في الكود التالي ، يمكنك استخدام المنشئ لإنشاء كائن الأصل. من خلال القيام بذلك ، سيتم مورث كل من خصائصه وخصائص النموذج الأولي للموفر.
<script type="text/javascript">// مُنشئ الوالدين
وظيفة person () {
this.name = "trigkit4" ؛
}
// أضف إلى سمة النموذج الأولي
person.prototype.getName = function () {
إرجاع هذا.
} ؛
// إنشاء كائن فئة شخص جديد
var obj = شخص جديد () ؛
// وراثة
var kid = object (obj) ؛
ALERT (kid.getName ()) ؛ // trigkit4
</script>
في هذا الوضع ، يمكنك اختيار ورث كائن النموذج الأولي فقط الموجود في المنشئ الحالي. الكائنات ترث من الكائنات ، بغض النظر عن كيفية إنشاء الكائن الأصل ، كما هو موضح في المثال التالي:
<script type="text/javascript">// مُنشئ الوالدين
وظيفة person () {
this.name = "trigkit4" ؛
}
// أضف إلى سمة النموذج الأولي
person.prototype.getName = function () {
إرجاع هذا.
} ؛
// إنشاء كائن فئة شخص جديد
var obj = شخص جديد () ؛
// وراثة
var kid = object (person.prototype) ؛
console.log (typeof kid.getName) ؛ // وظيفة ، لأنها في النموذج الأولي
console.log (typeof kid.name) ؛ // غير محددة ، لأن هذا النموذج الأولي فقط ورث
</script>