واحد. نماذج أولية
يعرف الكثير من الناس أن جافا سكريبت هو ميراث نموذج أولي. يحتوي كل مُنشئ على عضو أولي ، يمكن من خلاله أن يكون ميراث JavaScript جميلًا.
في الواقع ، لا يمكن لهذه السمة وحدها إكمال ميراث JavaScript.
لن أقول الكثير عن النموذج الأولي الذي نستخدمه في الكود. يمكنك التحقق من المعلومات.
عضو آخر غير مرئي.
كل مثيل له سمة نموذج أولي تشير إلى النموذج الأولي. لا يمكن الوصول إلى هذه السمة وبالطبع لا يمكن تعديلها ، لأن هذا هو الأساس للحفاظ على ميراث JavaScript.
نسخة الكود كما يلي:
// بيان المنشئ
وظيفة guoyansi () {}
وظيفة guoyansiex () {}
// النموذج الأولي الميراث
guoyansiex.prototype = new guoyansi () ؛
// إنشاء كائن
var g1 = new guoyansiex () ؛
var g2 = new guoyansiex () ؛
يمكن تفسير الكائنات في الكود أعلاه من خلال الشكل التالي
2. صيانة النموذج الأولي
مثيل تم إنشاؤه بواسطة مُنشئ يشير سمة مُنشئه دائمًا إلى المنشئ. سوف نعتقد أن البيان صحيح في الوقت الحالي.
نسخة الكود كما يلي:
وظيفة guoyansi () {}
var obj1 = new guoyansi () ؛
console.log (obj1.constructor === guoyansi) ؛ // true
في الواقع ، لا يحتوي المُنشئ نفسه على سمة المنشئ ، فمن أين تأتي هذه السمة؟
الجواب هو: من النموذج الأولي.
لذلك ، يتم استخلاص الاستنتاجات التالية
نسخة الكود كما يلي: obj1.constructor === guoyansi.prototype.constructor === Guoyansi
نظرًا لأننا يمكننا العثور على المنشئ من خلال المنشئ ، يمكننا زيادة تحسين الرسم البياني أعلاه.
نسخة الكود كما يلي:
وظيفة guoyansiex () {}
guoyansiex.prototype = new guoyansi () ؛
console.log (guoyansiex.constructor === guoyansiex) // false
وفقًا للصورة أعلاه ، يجب أن تكون النتيجة أعلاه صحيحة ، ولكن لماذا تكون خاطئة؟
الآن قم بتحليل.
أعيد كتابة النموذج الأولي لـ Guoyansiex بواسطة مثيل Guoyansi ، وبالتالي فإن مُنشئ النموذج الأولي لـ Guoyansiex هو أيضًا مثيل لـ Guoyansi.
يأتي المُنشئ في مثال Guoyansi من النمط Guoyansi.protype. ومع ذلك ، لم تتم إعادة كتابة النمط guoyansi.protype.
لذلك يشير مُنشئ Guoyansi.Protype إلى Guoyansi (مُنشئ) ؛
بناءً على التحليل أعلاه ، نرسم الاستنتاجات التالية
نسخة الكود كما يلي: guoyansiex.constructor === guoyansi.constructor === Guoyansi ؛
إذا كانت متطلبات توجيه المنشئ دقيقة للغاية أثناء عملية التطوير ، فيمكن إجراء المعالجة التالية.
نسخة الكود كما يلي:
/** الطريقة 1: **/
وظيفة guoyansi () {}
وظيفة guoyansiex () {}
guoyansiex.prototype = new guoyansi () ؛
guoyansiex.prototype.constructor = guoyansiex ؛ // إعادة تعيين مؤشر المنشئ.
نسخة الكود كما يلي:
/**
الطريقة 2
**/
وظيفة guoyansi () {}
وظيفة guoyansiex () {
this.constructor = ediuments.callee ؛
}
guoyansiex.prototype = new guoyansi () ؛
نسخة الكود كما يلي:
/**
الطريقة 3
**/
وظيفة guoyansi () {}
وظيفة guoyansiex () {
this.constructor = guoyansiex ؛
}
guoyansiex.prototype = new guoyansi () ؛
3. ما هو استخدام النموذج الأولي غير المرئي؟
يمكننا تشغيل سلسلة النماذج الأولية المرئية لإكمال ميراثنا ، لذلك لا يمكننا رؤية وتشغيل سلسلة النماذج الأولية غير المرئية. ما هو استخدامه؟
هناك ميزة في الميراث الموجهة للكائنات: التشابه. الفئات الفرعية لها أوجه تشابه مع فصول الوالدين. لذلك ، في الفئات الفرعية ، لا يمكنك استخدام الحذف لحذف الأعضاء الموروثة من فئات الوالدين. وهذا يعني أن الفئات الفرعية يجب أن يكون لها خصائص فصول الوالدين.
للحفاظ على هذه الميزة ، تقوم JavaScript بإنشاء خاصية نموذجية غير مرئية داخل الكائن ولا تسمح للمستخدم بالوصول إليها. وبهذه الطريقة ، يمكن للمستخدم تعديل المنشئ لأي غرض ،
لن يدمر خصائص فئة الطفل التي لها فئة الوالدين.
باختصار: هناك حاجة إلى النماذج الأولية الداخلية من خلال آلية الميراث النموذجية النموذجية JavaScript ، في حين أن النماذج الأولية الخارجية مطلوبة من قبل المستخدمين لتنفيذ الميراث.
4. __proto__ في Firefox Engine Spidermonkey
لا يزال هذا الرمز.
نسخة الكود كما يلي:
وظيفة guoyansi () {}
guoyansi.prototype.age = 24 ؛
وظيفة guoyansiex () {}
var obj1 = new guoyansi () ؛
guoyansiex.prototype = obj1 ؛
guoyansiex.prototype.constructor = guoyansiex ؛ // إعادة تعيين مؤشر المنشئ.
var obj2 = new guoyansiex () ؛
أريد الآن الوصول إلى عصر خصائص النموذج الأولي لفئة الوالدين Guoyansi بدءًا من OBJ.
هذه هي الفكرة.
الخطوة 1: OBJ2 ====> OBJ2.Constructor.Prototype
الجزء 2: OBJ2.Constructor.Prototype ===> guoyansiex.prototype ؛
الجزء 3: guoyansiex.prototype ===> OBJ1 ؛
الجزء 4: OBJ1.Constructor ====> Guoyansi
الجزء 5: guoyansi.prototype.age
اكتبها مثل هذا: console.log (obj2.constructor.prototype.constructor.prototype.age) // 24 ؛
النتيجة النهائية هي 24.
والنتيجة النهائية هي 24. يمكن تنفيذها بشكل طبيعي ، ولكن في العديد من الكتب ، تقول أنه بعد تعديل المُنشئ ، لا يمكن للمستوى العثور على النموذج الأولي في الفئة الأصل. لا أعرف ما الذي يحدث.
ما يكفي من سمة أكثر إيجازا في firefox._proto_
بشكل افتراضي ، يضيف SpidermonKey سمة تسمى _proto_ إلى أي كائن تم إنشاؤه ، والذي يشير إلى النموذج الأولي الذي يستخدمه المنشئ.
في الواقع ، إنها سلسلة النماذج الأولية غير المرئية التي ذكرناها أعلاه ، لكنها مجرد إفصاح متنكر في هذا المكان.
يمكنك الوصول إلى العمر بهذه الطريقة
console.log (obj2 .__ proto __.__ proto __. age) ؛ // 24
هذا في الواقع ينجح في الوصول إلى سمة النموذج الأولي لفئة الأصل ، ولكن هذه السمة قابلة للتطبيق فقط على Firefox ، وستكون هناك أخطاء في المتصفحات الأخرى.
في E5 ، يتم تمديد الكائن إلى Object.getPrototypeoF () ، ويمكنك الوصول إلى جميع النماذج الأولية للفئة الأصل.
نسخة الكود كما يلي:
وظيفة guoyansi () {}
guoyansi.prototype.age = 24 ؛
وظيفة guoyansiex () {}
var obj1 = new guoyansi () ؛
guoyansiex.prototype = obj1 ؛
guoyansiex.prototype.constructor = guoyansiex ؛ // إعادة تعيين مؤشر المنشئ.
var obj2 = new guoyansiex () ؛
var proto = object.getPrototypeof (OBJ2) ؛
بينما (proto) {
console.log (proto.constructor) ؛
proto = object.getPrototypeof (proto) ؛
}
console.log ("النموذج الأولي للكائن"+proto) ؛
والنتيجة هي: guoyansiex
غويانسي
هدف
النموذج الأولي الفارغ للكائن
أنا شخصياً أعتقد أن هذه يجب اعتبارها واحدة من جوهر جافا سكريبت الموجهة نحو الكائن. يرجى الرجوع إليها بنفسك واستخدامها في مشروعك وفقًا لاحتياجاتك.