في الآونة الأخيرة ، عندما كنت أتعلم JavaScript وتعلم النموذج الأولي لـ JS الموجهة نحو الكائنات ، لدي الكثير من الأفكار. إذا كان هناك شيء خاطئ ، آمل أن يتم تصحيحه.
كلغة موجهة نحو الكائن ، يتمتع JS بطبيعة الحال بمفهوم الميراث ، ولكن لا يوجد مفهوم للفصول الدراسية في JS ، لذلك لا يوجد تمديد مشابه لتلك الموجودة في Java. لذلك ، أعتقد أن الميراث في JS يعتمد بشكل أساسي على النماذج الأولية (السلاسل) في JS.
إذن ، ما هو النموذج الأولي؟ نحن نعلم أن الوظائف في JS هي أيضًا كائن. عندما نقوم بإنشاء وظيفة ، تحتوي الوظيفة بالفعل على خاصية تسمى النموذج الأولي. هذا النوع من الجنس يسمى خاصية النموذج الأولي. إنه مؤشر يشير إلى كائن النموذج الأولي لهذه الوظيفة. يحتوي كائن النموذج الأولي هذا على خاصية افتراضية تسمى مُنشئ. يشير نوع الجنس هذا إلى وظيفة لها نوع أولي.
وظيفة person () {} person.prototype = {// constructor: person ؛ first_name: "guo" ، hair_color: "Black" ، City: "Zhengzhou" ، Act: function () {Alert ("Eatting") ؛}} ؛مع أخذ هذا كمثال ، أنشأنا أولاً شخص وظيفة. تحتوي هذه الوظيفة على نموذج أولي لسمات الافتراضية ، مشيرًا إلى كائن propttype. يحتوي هذا الكائن على مُنشئ السمة الافتراضي () ، person.prototype.constructor ---> الشخص. (في الواقع ، الافتراضي هنا هو الإشارة إلى الكائن ، وسيتم إجراء التصحيح لاحقًا)
ماذا يحدث عندما نقوم بإنشاء مثيل من خلال مُنشئ؟
وظيفة person () {} person.prototype = {first_name: "guo" ، hair_color: "Black" ، City: "Zhengzhou" ، Act: function () {Alert ("Eatting") ؛}} ؛ var boy = شخص جديد () ؛ var girl = شخص جديد () ؛في هذا الوقت ، نحتاج إلى معرفة أن الفرق بين المنشئ ودالة في JS هو الكلمة الرئيسية الجديدة ، والدالة التي تستخدم المشغل الجديد هي مُنشئ. عندما نقوم بإنشاء كائن مثيل الشخص وحفظه في الصبي ، الفتاة ، ستقوم كائنة المثيلان بإنشاء سمة افتراضية تسمى _proto_ (والتي يمكن تمثيلها بواسطة [[النموذج الأولي]] في ECMASCript5). يشير نوع الجنس هذا إلى كائن النموذج الأولي للمُنشئ ، أي boy._proto _--> person.prototype (لا علاقة له بالمنشئ). في هذا الوقت ، يمكن للبن أو الفتاة استخدام نقاط للاتصال بنوع الجنس في كائن النموذج الأولي. في هذا الوقت ، يجب أن تعرف أن الصبي والفتاة يشتركان في نوع جنس كائن النموذج الأولي. يمكننا التحقق من الاستنتاج أعلاه بواسطة isprotptypeof () أو object.getPrototypeof () (قيمة إرجاع هذه الوظيفة هي كائن النموذج الأولي ، أي قيمة _proto_).
ALERT (person.prototype.isprototypeof (boy)) ؛ // تنبيه حقيقي (object.getProtypeOf (boy) .first_name) ؛ // "قوه"
في هذا الوقت ، يمكننا القيام بمزيد من التحقق. ماذا لو أنشأنا سمة مكررة مع سمة كائن النموذج الأولي في المثيل؟
var boy = شخص جديد () ؛ var girl = شخص جديد () ؛ boy.hair_color = "red" ؛ تنبيه (boy.hair_color) ؛ // Red Alert (girl.hair_color) ؛ // Black Alert (Object.getProtypeof (boy) .Hair_Color) ؛ //أسود
يمكن ملاحظة أن السمة المكررة المعلنة في المثيل ستحظر الخصائص في كائن النموذج الأولي ، ولكن سيتم الكتابة عليها فقط ولن تؤثر على نوع جنس كائن النموذج الأولي (object.getPrototypeof (boy) .hair_color == Black) ، ولن يؤثر على كائنات المثيل التي تشترك في نوع Genus of the Girl.hair ==. في الوقت نفسه ، يمكنك استخدام مشغل الحذف لحذف السمات المعلنة بواسطة كائن المثيل للتراجع عن تأثير التقنيع. يمكننا استخدام hasownproperty () للتحقق مما إذا كان هناك جنس موجود في مثيل (صحيح) أو في كائن النموذج الأولي (خطأ).
ALERT (boy.hasownproperty ("hair_color")) ؛ //حقيقييمكنك استخدام object.keys () لتعداد الخصائص.
var key = object.keys (person.prototype) ؛ تنبيه (مفتاح) ؛
بعد تعلمها ، سنجد أن استخدام طريقة الكتابة أعلاه لإعلان كائن النموذج الأولي ، ستكون هناك مشكلة. لم يعد المُنشئ يشير إلى الشخص ، وهو ما يتعارض مع الإشارة الافتراضية إلى وظيفة تحتوي على سمة النموذج الأولي. هذا لأنه: في كل مرة يتم فيها إنشاء وظيفة ، سيتم إنشاء كائن نموذج أولي تلقائيًا ، وسيقوم هذا الكائن بإنشاء مُنشئ افتراضيًا. لذلك ، هنا جوهرنا هو إعادة كتابة النموذج الافتراضي ، لذلك أصبح البناء الجديد أيضًا يشير إلى وظيفة الكائن ، ولم يعد يشير إلى وظيفة الشخص. إذا كان المنشئ مهمًا حقًا ، فأنت بحاجة إلى كتابة مُنشئ: الشخص.
بعد ذلك ، نحتاج إلى معرفة ديناميات النموذج الأولي. سيعكس تغيير الخصائص في كائن النموذج الأولي في المثيل ، بغض النظر عما إذا كان يتم إنشاء المثيل قبل أو بعد التغييرات العامة لكائن النموذج الأولي.
وظيفة person () {} person.prototype = {first_name: "guo" ، hair_color: "Black" ، City: "Zhengzhou" ، Act: function () {Alert ("EATATION") ؛}} ؛ var boy = شخص جديد () ؛ person.prototype.hobby = "كرة السلة" ؛ var girl = شخص جديد () ؛ ALERT (boy.hobby) ؛ //كرة السلةكما هو موضح في الكود أعلاه ، حتى إذا حدث تعديل خصائص كائن النموذج الأولي بعد إنشاء المثيل ، فإن مثيل الصبي لا يزال يشارك person.prototype.hobby.
ومع ذلك ، يحدث هذا الموقف فقط عند تعديل سمة كائن النموذج الأولي. عند إعادة كتابة سمة كائن النموذج الأولي بالكامل ، يجب وضع إنشاء المثيل بعد إعادة كتابة سمة كائن النموذج الأولي ، وإلا فإن الخطأ سيحدث.
وظيفة person () {} var girl = new person () ؛ person.prototype = {first_name: "guo" ، hair_color: "Black" ، City: "Zhengzhou" ، Act: function () {Alert ("Eatation") ؛}} ؛ var boy = شخص جديد () ؛ person.prototype.hobby = "كرة السلة" ؛ ALERT (boy.hobby) ؛ // Basketball Alert (girl.first_name) ؛ // غير محددبالعودة إلى مسألة "الحظر" ، تعلمنا في وقت سابق أن إنشاء سمة كائن مثيل (نفس الاسم مثل سمة معينة في كائن النموذج الأولي) سيمنع سمة كائن النموذج الأولي ، ولكن لن يؤثر على كائنات المثيلات الأخرى. هناك خطأ هنا. ينطبق هذا الموقف فقط على أنواع البيانات الأساسية. عندما تشير قيمة السمة إلى النوع ، ستحدث مشكلة كبيرة. انظر الرمز التالي.
وظيفة person () {} person.prototype = {first_name: "guo" ، hair_color: "Black" ، Friends: ["Nick" ، "John"] ، City: "Zhengzhou" ، Act: function () {Alert ( var boy = شخص جديد () ؛ boy.friends.push ("Mike") ؛ var girl = شخص جديد () ؛ ALERT (boy.friends) ؛ // Nick ، John ، Mike Alert (girl.friends) ؛ // نيك ، جون ، مايكيمكن ملاحظة أن الجملة أعلاه لا تنطبق ، لأن الأصدقاء موجودون في كائن النموذج الأولي ، وليس في الصبي ، وبالتالي فإن تعديلها سيؤثر على هذه البيئة. (يمكننا إنشاء خاصية لمثيل الصبي من خلال boy.frindes = []) ثم ، نحتاج إلى تقديم مجموعة من أنماط المنشئ وأنماط النموذج الأولي.
وظيفة الشخص (hair_color ، المدينة) {this.hair_color = hair_color ؛ this.city = المدينة ؛ this.friends = ["John" ، "Nick"] ؛ } person.prototype = {constructor: person ، first_name: "guo" ، Act: function () {Alert ("Eatation") ؛ }} ؛ var boy = شخص جديد ("أسود" ، "Zhengzhou") ؛ var girl = شخص جديد ("أحمر" ، "شنيانغ") ؛ boy.friends.push ("nick") ؛ تنبيه (girl.friends) ؛ ALERT (boy.friends) ؛هذا الوضع هو الطريقة الأكثر استخدامًا والأكثر شهرة لإنشاء أنواع مخصصة في ECMASCRIPT ، ويمكن استخدامها كوضع افتراضي.
ولكن بالنسبة للمبرمجين العاملين في لغات أخرى موجهة نحو الكائنات ، يبدو هذا النمط غريبًا. من أجل تغليف جميع المعلومات في المنشئ ، يظهر نمط النموذج الأولي الديناميكي. يستخدم الوضع الديناميكي بشكل أساسي عبارة IF لتحديد ما إذا كان كائن النموذج الأولي يحتاج إلى تهيئة لتحقيق الغرض من توفير الموارد.
بالإضافة إلى ذلك ، هناك وضع بناء آمن للتكيف مع الموقف الذي لا توجد فيه سمة مشتركة ولا استخدام لهذا.
تحليل النموذج الأولي أعلاه في JavaScript [الموصى به] هو كل المحتوى الذي أشاركه معك. آمل أن تتمكن من إعطائك مرجعًا وآمل أن تتمكن من دعم wulin.com أكثر.