النوع المرجعي
تشمل أنواع المرجع بشكل رئيسي: نوع الكائن ، نوع الصفيف ، نوع التاريخ ، نوع regexp ، نوع الوظيفة ، إلخ.
عند استخدام أنواع المرجع ، يجب إنشاء كائن (مثيل) منها. وبعبارة أخرى ، فإن النوع المرجعي يعادل قالب. عندما نريد استخدام نوع مرجعي معين ، نحتاج إلى استخدام هذا القالب لإنشاء كائن للاستخدام ، وبالتالي فإن نوع المرجع يسمى أحيانًا تعريف الكائن.
على سبيل المثال ، نحتاج إلى إنشاء كائن شخص لتحديد المعلومات الشخصية وسلوكها ، لذلك نحن بحاجة إلى الاعتماد على نوع الكائن:
var person = new Object () ؛ person.name = "jiangshui" ؛ person.sayname = function () {console.log (this.name) ؛}يتم تعريف كائن الشخص أعلاه بواسطة "القالب" باستخدام المشغل الجديد باستخدام نوع الكائن. بعد ذلك ، يمكنك إضافة اسم السمة وطريقة sayname لهذا الكائن. الخصائص والأساليب هي "وظائف" لأنواع الكائنات ، لذلك يمكن استخدام الكائنات التي تم إنشاؤها من خلال أنواع المراجع مثل الكائن.
لا يتطلب إنشاء كائن بالضرورة استخدام المشغل الجديد. هناك بعض الأنواع التي يمكن تبسيطها في الإنشاء. على سبيل المثال ، إنشاء كائن من النوع مثل أعلاه ، يمكنك أيضًا استخدام الطريقتين التاليتين:
var person = {} ؛ person.name = "jiangshui" ؛ person.sayname = function () {console.log (this.name) ؛}أو
var person = {name: "jiangshui" ، sayname: function () {console.log (this.name) ؛ }} ؛وظيفة المشغل {} هي نفس الكائن الجديد () ، مما يؤدي إلى تبسيط العمليات. هناك بعض الاختلافات في طريقتي الكتابة أعلاه. الأول هو "إلحاق" ، أي في التعريف السابق ، تواصل إضافة سمات أو طرق. إذا كانت طريقة السمة التي يحمل نفس الاسم موجودة بالفعل من قبل ، فسيتم الكتابة عليها. النوع الثاني هو "استبدال" ، مما يعني أنه بغض النظر عما إذا كانت خصائص وطرق كائن الشخص محددة من قبل ، ستحل هذه الطريقة محل المحتوى المحدد مسبقًا بالمحتوى المحدد حديثًا. نظرًا لأن الكائن الذي تم إنشاؤه بواسطة النوع المرجعي هو منطقة مخزنة في الذاكرة ، ثم يتم حفظ مؤشره في متغير معين (شخص) ، فإن الطريقة الثانية للكتابة هي إنشاء كائن جديد (منطقة ذاكرة جديدة) ، ثم قم بتوجيه متغير الشخص إلى منطقة الذاكرة الجديدة ، بحيث يتم استبدال واحد السابق. فهم هذا أمر بالغ الأهمية للفهم اللاحق.
إن استخدام أنواع المرجع الأخرى هو نفسه تقريبًا ، مثل نوع الصفيف ، والذي يمكن استخدامه أيضًا لإنشاء كائنات أو تعريفها مباشرة. بعد إنشاء كائن صفيف ، يمكنك تخزين محتوى المعلومات بتنسيق الصفيف. بالإضافة إلى ذلك ، سيحصل الكائن على الطرق المحددة في نوع الصفيف ، مثل الدفع ، التحول ، الفرز ، وما إلى ذلك ، ويمكنك استدعاء هذه الأساليب ، مثل:
var colors = [] ؛ colors.push ('Red' ، 'Green') ؛ console.log (colors) ؛يقوم الرمز أعلاه بإنشاء كائن من نوع الصفيف من خلال نوع الصفيف ، ثم يستدعي طريقة الدفع المحددة مسبقًا في نوع الصفيف ، ويضيف قيمتين أحمر وأخضر إلى الكائن ، ويطبعه أخيرًا على وحدة التحكم ويمكنك رؤيته.
اتصل وتطبيق الأساليب
يتم توفير هاتين الطريقتين من نوع الوظيفة ، مما يعني أنه يمكن استخدامهما في الوظائف. وظيفة المكالمة هي نفس طريقة التطبيق ، وهي أنه يمكنها توسيع نطاق تشغيل الوظيفة. الفرق هو أنه عند استخدام المكالمة ، يجب أن يتم إدراج المعلمات التي تم تمريرها إلى الوظيفة واحدة تلو الأخرى ، لكن طريقة التطبيق لا تستخدمها. وبهذه الطريقة ، يمكنك أن تقرر استخدام المكالمة أو التقديم وفقًا لمتطلبات وظيفتك الخاصة.
ماذا يعني نطاق عملية التوسع؟ سوف تفهم من خلال إعطاء مثال.
يمكنك أن تفهم بهذه الطريقة أن الوظيفة ملفوفة في حاوية (نطاق) ، وهناك بعض المتغيرات أو الأشياء الأخرى في هذه الحاوية. عند تشغيل الوظيفة ، يتم استدعاء هذه المتغيرات ، وما إلى ذلك ، ستجد هذا الشيء في الحاوية الحالية. هذه الحاوية تلتف بالفعل حاوية أكبر بالخارج. إذا لم يكن لدى الحاوية الصغيرة الحالية ، فستبحث الوظيفة في الحاوية الأكبر ، وما إلى ذلك ، وتجد أكبر كائن نافذة حاوية. ومع ذلك ، إذا كانت الوظيفة تعمل في الحاوية الصغيرة الحالية ، فهناك متغيرات مقابلة ، وما إلى ذلك. في الحاوية الصغيرة ، حتى في الحاوية الكبيرة ، ستظل الوظيفة تسميها في الحاوية الخاصة بها.
تتمثل الأساليب والتطبيق في حل هذه المشكلة واختراق قيود الحاويات. بالنسبة للمثال السابق:
var person = {name: "jiangshui" ، sayname: function () {console.log (this.name) ؛ }} ؛بعد فتح وحدة التحكم في Chrome ، قم بلصقها وتنفيذها ، ثم قم بتنفيذ person.sayname () لترى
في هذا الوقت ، الشخص عبارة عن حاوية ، تنشئ طريقة sayname (وظيفة). عند التنفيذ ، يجب تنفيذها تحت نطاق الشخص. عند تنفيذها مباشرة في الأسفل ، فإن التنفيذ تحت نطاق النافذة سيؤدي إلى حدوث خطأ غير محدد لأن طريقة sayname غير محددة أدناه. هذا المؤشر بداخله هو شيء خاص ، والذي يشير إلى النطاق الحالي. معنى this.name هو استدعاء قيمة الاسم أسفل النطاق الحالي.
بعد ذلك ، نضيف سمة اسم إلى كائن النافذة:
window.name = "yujiangshui" ؛
أو مباشرة
name = "Yujiangshui" ؛
لأن النافذة هي أكبر حاوية ، يمكن حذف النافذة. يتم إرفاق جميع السمات أو المتغيرات المحددة بالنافذة. إذا كنت لا تصدق ذلك ، يمكنك أن ترى:
الآن نريد تشغيل طريقة SayName في الحاوية الصغيرة تحت الحاوية الكبيرة للنافذة. نحتاج إلى استخدام الاتصال أو التقدم لتوسيع نطاق طريقة SayName. تنفيذ البيان التالي:
person.sayname.call (نافذة) ؛
أو
person.sayname.call (هذا) ؛
نتائج الإخراج هي نفسها. يمكنك أيضًا استخدام التطبيق لرؤية التأثير ، لأن هذا العرض التجريبي بسيط للغاية ولا يتطلب معلمات تمرير ، وبالتالي فإن وظائف الاتصال والتطبيق متسقة تمامًا.
اسمحوا لي أن أشرح الرمز أعلاه. SayName هو أول مثيل لنوع الوظيفة ، والذي يحتوي على طريقة الاتصال وطريقة تطبيق. نظرًا لأن أساليب الاتصال والتطبيق هي أساليب الوظيفة ، نحتاج إلى الاتصال بـ person.sayname.call (نافذة) بهذه الطريقة بدلاً من الشخص.
ثم تكون معلمات المكالمة وتطبيق الأساليب هي نطاق (كائن) ، مما يشير إلى أن الوظيفة السابقة يتم تشغيلها تحت النطاق الذي تم تمريره. بعد تمرير كائن النافذة ، هذا. اسم في طريقة sayname إلى window.name ، بحيث يتم توسيع نطاق.
لماذا النافذة المارة وهذا له نفس التأثير؟ نظرًا لأن الموقع الحالي لتنفيذ هذه الوظيفة هو نافذة ، كما ذكرنا سابقًا ، يشير هذا المؤشر إلى النطاق الحالي ، بحيث يشير هذا المؤشر إلى النافذة ، بحيث يساوي النافذة.