سلسلة النموذج الأولي مربكة بعض الشيء لفهمها ، وهناك الكثير من المعلومات عبر الإنترنت. في كل مرة لا أستطيع النوم في الليل ، أود دائمًا العثور على بعض سلاسل النموذج الأولي وإغلاق المقالات عبر الإنترنت للقراءة ، وهو أمر فعال للغاية.
لا تقلق بشأن هذه المصطلحات الكثيرة ، فلن تساعدك حقًا باستثناء جعل عقلك يلف. انظر فقط إلى سلسلة النموذج الأولي ببساطة وفكر في الأشياء التي لا علاقة لها بالرمز ، مثل البشر والشياطين والرجال الخجري.
1) يولد الناس من قبل البشر ، والوحوش يولدون من قبل الشياطين. البشر والشياطين كلاهما حالات من الأشياء ، في حين أن البشر والشياطين نماذج أولية. النموذج الأولي هو أيضًا كائن ، يسمى كائن النموذج الأولي.
2) يمكن أن تلد والدة الشخص ووالده حفنة من الأطفال ، ويمكن لأم شيطان ووالده أن تلد مجموعة من الأطفال. يمكن أن تلد زوجة الرجل والرجل مجموعة من الأطفال. الرجل هو مُنشئ ، يُعرف باسم الرجل.
3) يمكن للناس تسجيل معلومات حول الجنس ، حتى يتمكن الأشخاص من العثور على معلومات حول الجنس من خلال الجنس ، أي يمكنهم العثور على المُنشئ من خلال كائنات النموذج الأولي.
4) يمكن للناس أن يولد العديد من الأطفال في أمهاتهم ، لكن هؤلاء الأطفال لديهم أم واحدة فقط ، وهي تفرد النموذج الأولي.
5) يولد الناس أيضًا من قبل الناس ، ويجدون أشخاصًا من خلال الناس ، ثم يجدون أشخاصًا من خلال الناس ... تسمى هذه العلاقة سلسلة النموذج الأولي.
6) سلسلة النموذج الأولي ليست غير محدودة. عندما تستمر في البحث عن الناس ، ستجد أن الناس سخيفون ... ليسوا بشرًا سخيفًا ، أي أن سلسلة النموذج الأولي تشير أخيرًا إلى Null.
7) سيبدو الأشخاص الذين ولدوا مع أمي مثل الناس ، وسيكون الوحوش المولودة بأمي قبيحًا. وهذا ما يسمى الميراث.
8) ورثت لون الجلد لأمك ، ورثت والدتك لون الجلد لأمك ، والدتك ... ، هذا هو ميراث سلسلة النموذج الأولي.
9) إذا لم يكن لديك منزل ، فإن منزلك يشير إلى منزل أمك ؛ إذا لم يكن لدى والدتك منزلاً ، فإن منزلك يشير إلى منزل والدتك ... هذا هو البحث الصاعد لسلسلة النموذج الأولي.
10) سترث مظهر والدتك ، ولكن يمكنك أيضًا صبغ شعرك وشامبو وقطع وضرب ، أي يمكن تخصيص سمات الكائن وستتجاوز السمات الموروثة.
11) على الرغم من أنك قد غسلت الشعر الأصفر ، لا يمكنك تغيير مظهر والدتك. الأخ الأصغر والأخت المولود لأمك لا علاقة له بغسل الشعر الأصفر ، وقطعه ، والشعر الأصفر المنفوخ ، أي أن مثيل الكائن لا يمكن أن يغير خصائص النموذج الأولي.
12) ولكن إذا تم إحراق منزلك من قبلك ، فهذا يعني أن والدتك وإخوتك محترقة ، وهذه هي مشاركة سمات النموذج الأولي.
13) لقب والدتك هو الأزان ، وعملية جارتها تتصل بك آزنر ، ولكن بعد أن تحول شعر والدتك من Piaorou إلى Golden Lion King ، غيرت العمة المجاورة كلماتها ودعاك إلى الأمير الأسد الذهبي. وهذا ما يسمى الطبيعة الديناميكية للنموذج الأولي.
14) والدتك تحب الجمال وذهبت إلى كوريا لإجراء الجراحة التجميلية. لم تستطع حتى التعرف على والدتها. حتى لو تغير شعر والدتك إلى النعومة ، فإن الجار المجاور لا يزال يطلق عليك أمير الأسد الذهبي. لأنه لم يتعرف أحد على والدتك ، فقد عادت والدتك إلى المصنع بعد الجراحة التجميلية. هذا هو إعادة كتابة النموذج الأولي.
عليك اللعنة! أنت كاف! لا BB! أرني الرمز!
وظيفة الشخص (الاسم) {this.name = name ؛ } وظيفة الأم () {} mother.prototype = {// الأم النموذجية الأولي: 18 ، الصفحة الرئيسية: ['beijing' ، 'shanghai']} ؛ person.prototype = new Mother () ؛ // النموذج الأولي للشخص هو الأم // استخدم أداة تصحيح الكروم لعرض النموذج الأولي ، مما يوفر واجهة __proto__ لعرض النموذج الأولي var p1 = شخص جديد ('Jack') ؛ // p1: 'Jack' ؛ __proto __: 18 ، ['Beijing' ، 'Shanghai'] var p2 = new شخص ('mark') ؛ // p2: 'mark' ؛ __proto __: 18 ، ['Beijing' ، 'Shanghai'] p1.age = 20 ؛ /* لا يمكن للمثال تغيير سمة القيمة الأساسية للنموذج الأولي ، تمامًا كما تغسل وتقطيع وصبغ الشعر الأصفر لا علاقة له بأمك* العملية العادية لإضافة سمة العمر تحت مثيل P1 لا علاقة لها بالنموذج الأولي. مثل var o {} ؛ O.AGE = 20. * P1: هناك سن سمة إضافية أدناه ، و __proto__ هو نفس النمط الأم ، العمر = 18. * p2: اسم السمة فقط ، __proto__ هو نفسه mother.prototype*/p1.home [0] = 'Shenzhen' ؛ /* تبادل سمات النوع المرجعي في النموذج الأولي تمامًا مثل تحرق منزلك ، إنه يحرق منزل عائلتك بأكمله* هذا مجرد تمريرة ، دعنا نتعرض له بعناية أدناه؟ * P1: 'Jack' ، 20 ؛ __proto __: 18 ، ['Shenzhen' ، 'Shanghai']* p2: 'mark' ؛ __proto __: 18 ، ['Shenzhen' ، 'Shanghai']*/p1.home = ['Hangzhou' ، 'Guangzhou'] ؛ /* في الواقع ، نفس العملية مثل p1.age = 20. التغيير إلى هذا الفهم: var o {} ؛ O.House = ['Big' ، 'House']* p1: 'Jack' ، 20 ، ['Hangzhou' ، 'Guangzhou'] ؛ __proto __: 18 ، ['Shenzhen' ، 'Shanghai']* p2: 'mark' ؛ __proto __: 18 ، ['Shenzhen' ، 'Shanghai']*/delete p1.age ؛ /* بعد حذف السمات المخصصة ، سيتم إعادة تعبير قيمة النموذج الأولي الأصلي في الأصل. هذه هي آلية البحث التصاعدي ، لذلك هناك الديناميات التالية* p1: 'Jack' ، ['Hangzhou' ، 'Guangzhou'] ؛ __proto __: 18 ، ['Shenzhen' ، 'Shanghai']* p2: 'mark' ؛ __proto __: 18 ، ['Shenzhen' ، 'Shanghai']*/person.prototype.lastname = 'Jin' ؛ /* أعد كتابة النموذج الأولي وتفاعل ديناميكيًا على المثيل. مثلما أصبحت والدتك شخصًا عصريًا ، يقول الجيران إنك ابن امرأة عصرية عندما يذكرونها* لاحظ أننا نعيد كتابة النموذج الأولي للشخص هنا ، وهو إضافة سمة اسم العائلة إلى الأم ، وهو ما يعادل الأم. إذا قمت بتغيير مستويات مختلفة ، فستكون التأثيرات مختلفة جدًا. * P1: 'Jack' ، ['Hangzhou' ، 'Guangzhou'] ؛ __proto __: 'jin' ؛ __ proto __: 18 ، ['Shenzhen' ، 'Shanghai']* p2: 'mark' ؛ __proto __: 'jin' ؛ __ proto __: 18 ، ['Shenzhen' ، 'Shanghai']*/person.prototype = {Age: 28 ، العنوان: {Country: 'USA' ، City: 'Washington'}} ؛ var p3 = new person ('' Obama ') ؛ /* أعد كتابة النموذج الأولي! في هذا الوقت ، أصبح النموذج الأولي للشخص كائنًا جديدًا تمامًا ، مما يعني أن الشخص قد غير والدته. * لفهمه مثل هذا: var a = 10 ؛ ب = أ ؛ أ = 20 ؛ ج = أ. لذا ، يبقى B دون تغيير ويصبح C ، لذلك يتغير P3 وليس له علاقة بالأم. * P1: 'Jack' ، ['Hangzhou' ، 'Guangzhou'] ؛ __proto __: 'jin' ؛ __ proto __: 18 ، ['Shenzhen' ، 'Shanghai']* p2: 'mark' ؛ __proto __: 'jin' ؛ __ proto __: 18 ، ['Shenzhen' ، 'Shanghai']* p3: 'Obama' ؛ __ proto__: 28 {Country: 'USA' ، City: 'Washington'}*/mother.prototype.no = 9527 ؛ مثلما أصبحت والدتك اتجاهًا جديدًا ، يقول الجيران إنك حقًا جدة عصرية* لاحظنا أننا نعيد كتابة الأم. النمط النمط هنا ، سيتغير P1P2 ، لكن P3 أعلاه لا علاقة له بالأم ، ولن يؤثر عليه. * P1: 'Jack' ، ['Hangzhou' ، 'Guangzhou'] ؛ __proto __: 'jin' ؛ __ proto __: 18 ، ['Shenzhen' ، 'Shanghai'] ، 9527* p2: 'mark' ؛ __proto __: 'jin' ؛ __ proto __: 18 ، ['Shenzhen' ، 'Shanghai'] ، 9527* p3: 'Obama' ؛ __proto__: 28 {Country: 'USA' ، City: 'Washington'}*/Mother.prototype = {Car: 2 ، Hobby: ['Run' ، 'Walk'] ؛ var p4 = new شخص ('tony') ؛/* إعادة كتابة النموذج الأولي للنموذج الأولي! في هذا الوقت ، أصبح النموذج الأولي للأم كائنًا جديدًا تمامًا! * نظرًا لأن الشخص والأم قد تم فصلهما عن الأعلى ، فلن يؤثر تغيير الأم على الشخص. * p4: 'tony' ؛ __ proto__: 28 {Country: 'USA' ، City: 'Washington'}*/person.prototype = new Mother () ؛ // bind var مرة أخرى p5 = شخص جديد ('luffy') ؛ // إذا كنت بحاجة إلى تطبيق هذه التغييرات في هذا الوقت ، فيجب عليك إعادة صياغة النموذج الأولي للشخص إلى الأم // p5: 'luffy' ؛ __ proto__: 2 ، ['run' ، 'walk'] الأم .__ proto __.__ proto __.__ proto__ // null ، هل تعتقد أن نقطة نهاية سلسلة النموذج الأولي ليست فارغة؟يمكنك أن تفهم بشكل أساسي بعد قراءته؟
الآن دعنا نتحدث عن الفرق بين p1.age = 20 ، p1.home = ['Hangzhou' ، 'Guangzhou'] و p1.home [0] = 'Shenzhen'. p1.home [0] = 'Shenzhen' ؛ لتلخيص ، إنه شكل مثل p1.object.method ، p1.object.property.
p1.age = 20 ؛ p1.home = ['Hangzhou' ، 'Guangzhou'] ؛ من السهل فهم هذه الجملتين. ننسى النموذج الأولي أولاً وفكر في كيفية إضافة سمات إلى كائن عادي:
var obj = new Object () ؛ obj.name = 'xxx' ؛ obj.num = [100 ، 200] ؛
هل تفهم بهذه الطريقة؟ إنه نفس الشيء.
إذن لماذا لا تقوم P1.home [0] = "Shenzhen" بإنشاء خاصية صفيف منزلية تحت P1 ثم تعيين أول موقع لها على "Shenzhen"؟ دعونا ننسى هذا أولاً ، فكر في كائن OBJ أعلاه. إذا كان مكتوبًا مثل هذا: var obj.name = 'xxx' ، obj.num = [100 ، 200] ، هل يمكنك الحصول على النتيجة التي تريدها؟ من الواضح أنك لن تحصل على أي شيء باستثناء خطأ. لأن OBJ لم يتم تعريفه بعد ، كيف يمكنك إضافة شيء إليه؟ وبالمثل ، لم يتم تعريف المنزل في p1.home [0] بموجب P1 ، لذلك من المستحيل تحديد المنزل مباشرة [0]. إذا كنت ترغب في إنشاء صفيف منزلي تحت P1 ، بالطبع ، فهي مكتوب مثل هذا:
p1.home = [] ؛ p1.home [0] = 'Shenzhen' ؛
أليس هذه هي الطريقة الأكثر استخدامًا؟
السبب وراء عدم الإبلاغ عن خطأ p1.home [0] = 'Shenzhen' مباشرة عن وجود خطأ هو أن هناك آلية بحث في سلسلة النموذج الأولي. عندما ندخل p1.object ، فإن آلية البحث في سلسلة النموذج الأولي هي البحث عن القيمة المقابلة في المثيل أولاً. إذا كان لا يمكن العثور عليها ، فسيتم البحث في النموذج الأولي. إذا لم يكن من الممكن العثور عليها ، فسيبحث في المستوى السابق من سلسلة النموذج الأولي ... فسيصل إلى نهاية سلسلة النموذج الأولي ، أي إذا لم يتم العثور عليها بعد ، فسيعود غير محدد. عندما ندخل p1.home [0] ، فإن نفس آلية البحث صحيحة أيضًا. أول البحث P1 لمعرفة ما إذا كانت هناك أي سمات وطرق مسموسة المنزل ، ثم ابحث عن تصاعدي خطوة بخطوة. أخيرًا ، وجدنا ذلك في النموذج الأولي للأم ، لذا فإن تعديله يعادل تعديل النموذج الأولي للأم.
باختصار: p1.home [0] = 'Shenzhen' يعادل mother.prototype.home [0] = 'Shenzhen'.
من التحليل أعلاه ، يمكننا أن نرى أن المشكلة الرئيسية لميراث سلسلة النموذج الأولي تكمن في مشاركة السمات. في كثير من الأحيان نريد فقط مشاركة الأساليب ولكن ليس السمات. من الناحية المثالية ، يجب أن يكون لكل مثيل سمات مستقلة. لذلك ، هناك طريقتان لتحسين ميراث النموذج الأولي:
1) الجمع بين الميراث
وظيفة الأم (العمر) {this.age = Age ؛ this.hobby = ['Running' ، 'Football']} mother.prototype.showage = function () {console.log (this.age) ؛ ؛ // التنفيذ الثاني this.name = name ؛ } person.prototype = new Mother () ؛ // التنفيذ الأول person.prototype.constructor = person ؛ person.prototype.showname = function () {console.log (this.name) ؛} var p1 = شخص جديد ('Jack' ، 20) ؛ p1.hobby.push ('كرة السلة') ؛ // p1: 'Jack' ؛ __proto __: 20 ، ['Running' ، 'Football] var p2 = new شخص (' mark '، 18) ؛ // p2: 'mark' ؛ __proto __: 18 ، ["الجري" ، "كرة القدم"]النتيجة أرجوانية:
عندما يتم تنفيذ التنفيذ الأول هنا ، تحصل على person.prototype.age = غير محدد ، person.prototype.hobby = ['Running' ، 'Football']. التنفيذ الثاني هو أن var p1 = شخص جديد ('Jack' ، 20) وستحصل على p1.age = 20 ، p1.hobby = ['running' ، 'Football']. بعد الدفع ، يصبح p1.hobby = ["الجري" ، "كرة القدم" ، "كرة السلة"]. في الواقع ، من السهل نسبيًا فهم التغييرات في هذا. يمكنك الحصول على هذه النتيجة ببساطة عن طريق استبدال هذا. إذا كنت تشعر أنه من المربك بعض الشيء أن نفهم ، فحاول التخلص من المفاهيم في عقلك وتنفيذ الكود من أعلى إلى أسفل كمتصفح. هل ستخرج؟
من خلال تنفيذ Mothertor Mother () مُنشئ النموذج الأولي للمرة الثانية ، قمنا بنسخ نسخة من خصائص النموذج الأولي في مثيل الكائن ، حتى نتمكن من الانفصال والانفصال عن خصائص النموذج الأولي. إذا كنت حريصًا ، فستجد أنه في المرة الأولى التي اتصلنا فيها بـ Mother () ، يبدو أنه لا يوجد أي فائدة. كيف لا يمكننا أن نسميها؟ نعم ، هناك الميراث المزيج الطفيلي التالي.
2) ميراث الجمع الطفيلي
كائن الوظيفة (O) {function f () {} f.prototype = o ؛ إرجاع function new f () ؛} الوظيفة النموذجية (الشخص ، الأم) {var ortotype = object (mother.prototype) ؛ النموذج الأولي. constructor = شخص ؛ person.prototype = النموذج الأولي ؛ } وظيفة الأم (العمر) {this.age = age ؛ this.hobby = ['Running' ، 'Football']} mother.prototype.showage = function () {console.log (this.age) ؛ ؛ this.name = name ؛ } النمط الوراثي (الشخص ، الأم) ؛ person.prototype.showname = function () {console.log (this.name) ؛} var p1 = شخص جديد ('Jack' ، 20) ؛ p1.hobby.push ('Basketball') ؛ // p1: 'Jack' ؛ __proto __: 20 ، ['Running' ، 'Football] var p2 = new شخص (' mark '، 18) ؛ // p2: 'mark' ؛ __proto __: 18 ، ["الجري" ، "كرة القدم"]النتيجة أرجوانية:
لم تعد هناك سمات العمر والهواية في النموذج الأولي ، لا يوجد سوى طريقتان ، وهما بالضبط النتيجة التي نريدها!
النقطة الرئيسية هي في الكائن (O) ، حيث يتم استعارة كائن مؤقت هنا لتجنب استدعاء Mother () الجديد بذكاء ، ثم إعادة مثيل كائن جديد باستخدام نموذج أولي ، وبالتالي إكمال إعداد سلسلة النموذج الأولي. إنه أمر محير للغاية ، أليس كذلك؟ ذلك لأننا لا نستطيع تعيين الشخص. النمط النمط = mother.prototype مباشرة.
ملخص
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
بعد قوله كثيرًا ، يوجد بالفعل جوهر واحد فقط: مشاركة السمات والتحكم المستقل. عندما يحتاج مثيل الكائن الخاص بك إلى سمات مستقلة ، فإن جوهر جميع الممارسات هو إنشاء سمات في مثيل الكائن. إذا كنت لا تفكر كثيرًا ، فيمكنك تحديد السمات المستقلة التي تحتاجها شخصيًا لتكتب خصائص النموذج الأولي بشكل مباشر. باختصار ، عند استخدام ميراث النموذج الأولي ، يجب أن تولي اهتمامًا خاصًا للسمات في النموذج الأولي ، لأنها جميعها تؤثر على الجسم كله.
فيما يلي قائمة بسيطة بالطرق المختلفة لإنشاء كائنات في JS. الطريقة الأكثر استخدامًا الآن هي وضع المركب. يمكن للطلاب المألوفين الانتقال إلى نهاية المقالة ويعجبهم.
1) الوضع الأصلي
// 1. الوضع الأصلي ، الوضع الحرفي الكائن var person = {name: 'jack' ، العمر: 18 ، sayname: function () {Alert (this.name) ؛ }} ؛ // 1. الوضع الأصلي ، وضع مُنشئ الكائن var person = new Object () ؛ person.name = 'Jack' ؛ person.age = 18 ؛ person.sayname = function () {Alert (this.name) ؛} ؛من الواضح ، عندما نريد إنشاء مجموعات من person1 ، person2 ... ، علينا كتابة الكثير من التعليمات البرمجية في كل مرة ، وحتى كبار الكبار لا يمكنهم تحملها! ثم هناك نموذج مصنع للإنتاج الضخم.
2) نموذج المصنع
// 2. وضع المصنع ، حدد وظيفة لإنشاء وظيفة الكائن CreatePerson (الاسم ، العمر) {var temp = new Object () ؛ person.name = name ؛ person.age = Age ؛ person.sayname = function () {Alert (this.name) ؛} ؛ return temp ؛ }وضع المصنع هو الإنتاج الضخم ، ويمكنك إدخال وضع صنع الإنسان مع مكالمة بسيطة (Papapapa ...). يمكنك إنشاء مجموعة من الأطفال من خلال تحديد اسمك وعمرك ، وتحرير يديك. ومع ذلك ، نظرًا لأنه يتم تشغيله في مصنع ، لا يمكنك تحديد نوع الكائن ، سواء كان إنسانًا أو كلبًا (اختبار مثيل هو كائن). بالإضافة إلى ذلك ، في كل مرة تقوم فيها بإنشاء إنسان ، يجب عليك إنشاء كائن مؤقت مستقل ، والرمز متضخم ، والفراشة أنيقة.
3) مُنشئ
// 3. وضع المنشئ ، حدد وظيفة مُنشئ لشخص دالة الكائن (الاسم ، العمر) {this.name = name ؛ this.age = age ؛ this.sayname = function () {Alert (this.name) ؛} ؛ } var p1 = شخص جديد ('جاك' ، 18) ؛ // إنشاء شخص p1 كائن ('جاك' ، 18) ؛ // يتم إعطاء طرق السمة إلى كائن النافذة ، window.name = 'jack' ، window.sayname () سوف يخرج المقبسيشبه المُنشئ منشئات الفئات في C ++ و Java ، ومن السهل فهمها. بالإضافة إلى ذلك ، يمكن استخدام الشخص كتعرف على النوع (اختبار مثيل هو الشخص والكائن). ومع ذلك ، لا تزال جميع الحالات مستقلة ، وطرق الحالات المختلفة هي في الواقع وظائف مختلفة. نسيت وظيفة الكلمة هنا ، فقط تعامل مع sayname ككائن وفهمها. وهذا يعني أن اسم Sayname من Zhang San و Li Si لهما وجودان مختلفان ، لكن من الواضح أن ما نتوقعه هو مشاركة اسم SayName لتوفير الذاكرة.
4) وضع النموذج الأولي
// 4. وضع النموذج الأولي ، حدد مباشرة وظيفة السمة النموذجية person () {} person.prototype.name = 'jack' } ؛ // 4. النموذج الأولي ، طريقة التعريف الحرفي وظيفة person () {} person.prototype = {name: 'Jack' ، العمر: 18 ، sayname: function () {Alert (this.name) ؛ }} ؛ var p1 = new person () ؛ // name = 'jack'var p2 = new person () ؛ // name = 'Jack'ما يجب ملاحظته هنا هو تبادل سمات وطرق النموذج الأولي ، أي أن جميع الحالات تشير فقط إلى طرق السمة في النموذج الأولي ، وستؤدي التغييرات التي تم إنشاؤها في أي مكان إلى تغييرات في مثيلات أخرى.
5) الوضع المختلط (البناء + النموذج الأولي)
// 5. وضع النموذج النموذجي وضع مجموعة ، شخص الوظيفة (الاسم ، العمر) {this.name = name ؛ this.age = age ؛} person.prototype = {hobby: ['Running' ، 'Football'] ؛ sayname: function () {Alert (this.name) ؛ } ، sayage: function () {Alert (this.age) ؛ }} ؛ var p1 = شخص جديد ('جاك' ، 20) ؛ // p1: 'Jack' ، 20 ؛ __proto__: ["Running" ، "Football"] ، SayName ، SayageVar P2 = شخص جديد ("Mark" ، 18) ؛ // p1: 'Mark' ، 18 ؛ __ proto__: ['Running' ، 'Football'] ، sayname ، sayageيتمثل النهج في وضع أساليب الممتلكات التي يجب أن تكون مستقلة في المنشئ ، ويتم وضع الأجزاء التي يمكن مشاركتها في النموذج الأولي. هذا يمكن أن يزيد من وفورات الذاكرة مع الحفاظ على استقلال مثيلات الكائن.