كنموذج لتطوير البرمجيات ، تم استخدام نمط متجانس على نطاق واسع في العديد من اللغات الموجهة للكائنات. في JavaScript ، يستخدم نمط العصر الحجري أيضًا على نطاق واسع. ومع ذلك ، نظرًا لأن لغة JavaScript لها طريقة فريدة موجهة للكائنات ، فهي تتفق مع بعض اللغات التقليدية الموجهة للكائنات ، لكنها لا تزال مختلفة في التنفيذ.
أولاً ، دعنا نلقي نظرة على تعريف أنماط المونومر باللغات التقليدية الموجهة للكائنات: أنماط المونومر هي فئات لا يمكن إنشاء مثيل لها إلا مرة واحدة ويمكن الوصول إليها من خلال نقطة وصول معروفة. هناك نقطتان في هذا التعريف يسلط الضوء على خصائص اللغات التقليدية الموجهة للكائنات ، وهما الطبقة والتثبيت. لذلك ، بالنسبة لللغات التقليدية الموجهة للكائنات ، يعتمد نمط العصر الحجري على الخصائص الطبيعية لفئتها وتثبيتها. بمعنى ، استخدم فئة الكلمات الرئيسية لتحديد فئة ، والتي يمكن إنشاء مثيل لها من خلال الكلمة الرئيسية الجديدة ، ولكن يجب التأكد من أنه في كل مرة يتم إنشاء مثيل لها بواسطة جديد ، يتم الحصول على نفس الحالة أو أنه لا يمكن استدعاء مُنشئه إلا مرة واحدة من خلال جديدة.
دعنا نلقي نظرة على تعريف نمط المونومر في JavaScript: Monomer هو كائن يستخدم لتقسيم مساحة الاسم وتنظيم مجموعة من الأساليب والسمات ذات الصلة معًا. إذا كان من الممكن إنشاء إنشاء مثيل له ، يمكن إنشاء مثيله مرة واحدة فقط. مقارنة بالتعريف أعلاه ، ستجد أن تعريف المونومر هنا يعرّف جوهره ككائن ، بدلاً من فئة بلغة تقليدية موجهة نحو الكائن ، والتي توضح أيضًا أن لغة JavaScript تعتمد على الكائن. في الوقت نفسه ، تمت الإشارة لاحقًا إلى أنه إذا كان من الممكن إنشاء مثيل له ، فإن هذا يدل على أنه يجب أن يكون هناك عدة طرق لتحديد المونومرات في JavaScript. هناك طريقة واحدة أو أكثر لإنشاء إنشاء مثيل له ، أي استخدام الكلمة الرئيسية الجديدة لإنشاء كائنات مونومر. ومع ذلك ، فإن هذه الطريقة ليست ميزة طبيعية لـ JavaScript نفسها ، لأن الكائنات التي تم إنشاؤها باستخدام الكلمة الرئيسية الجديدة يتم محاكاةها بالفعل وتحديدها من خلال الوظائف (على الرغم من أن ES6 قد بدأت في دعم الكلمة الرئيسية للفئة ، إلا أنها لم يتم دعمها على نطاق واسع من قبل المتصفح). إذن كيفية استخدام الميزات الطبيعية لـ JavaScript لتنفيذ أنماط المونومر؟
var singleton = {Attribute1: true ، attribute2: 10 ، method1: function () {} ، method2: function (arg) {}}فيما يلي كائن Singleton ، الذي يحتوي على العديد من الخصائص والأساليب. يتم تضمينه في الصفحة. يتم إنشاء هذا الكائن عند تحميل JS. يسمى باستخدام singleton.method1 عند الاتصال. تم الانتهاء من إنشاء مثيله أثناء تنفيذ الصفحة لتحميل JS. نحن لا نستخدم الكلمة الرئيسية الجديدة لإنشاء إنشاء هذا الكائن. هذا أيضًا فرق كبير بين تنفيذ الأنماط المتجانسة في JavaScript واللغات التقليدية الموجهة للكائنات. هذه الطريقة أبسط وأسهل في الفهم. ومع ذلك ، فإن هذه الطريقة لها العديد من العيوب. أحد العيوب الواضحة هو أنه لا يوفر مساحة اسم. إذا قام المبرمجون الآخرون أيضًا بتعريف متغير Singleton في الصفحة ، فمن السهل الكتابة فوق الكائن المتجانس وإرباكه. لذلك بالنسبة لهذه المشكلة ، يتم إعادة كتابتها على النحو التالي:
var myspace = {} ؛ myspace.singleton = {Attribute1: true ، attribute2: 10 ، method1: function () {} ، method2: function (arg) {}}هنا ، يتم تعريف مساحة اسم MySpace أولاً ، ثم يتم تركيب الكائن الفردي Singleton أسفل هذا الكائن ، مما يقلل بشكل كبير من إمكانية النزاعات مع المبرمجين الآخرين وسوء الفئة. حتى لو قام الآخرون بتعريف متغير Singleton في النطاق العالمي ، فلن يلوث كائن Singleton. هذا ينفذ وظيفة تقسيم مساحة الاسم وتنظيم بعض السمات والأساليب ذات الصلة كما هو مذكور في التعريف السابق.
لا تزال هذه الطريقة لها عيوبها. تتم مشاركة جميع خصائص وطرق هذا الكائن المتجانس ويمكن الوصول إليها وتعديلها في أي وقت من الخارج. لذلك ، يتم استخدام عمليات الإغلاق لمحاكاة الخصائص والأساليب الخاصة ، على النحو التالي:
myspace.singleton = (function () {var privateatTribute1 = false ؛ var privateattribute1 = [1،2،3] PublicMethod2: function (arg) {privateattribute1 = [4،5،6] ؛هنا نقوم مباشرة بتعيين وظيفة تنفيذ الذات المجهول إلى كائن Monolith. في هذه الوظيفة ، يتم استخدام الكلمات الرئيسية VAR و FUNCTION لتحديد خصائصها وأساليبها الخاصة على التوالي. لا يمكن الوصول إليها مباشرة خارج الوظيفة (خارج كائن متراصة) ، لأنه بمجرد تنفيذ الوظيفة ، سيتم إعادة تدوير مساحة النطاق الداخلي ، وهذا هو السبب في أنه يمكن استخدام عمليات الإغلاق لمحاكاة الخصائص والأساليب الخاصة. في هذه الوظيفة (الإغلاق) ، يتم إرجاع كائن أخيرًا ، والذي يحتوي على بعض الأساليب والخصائص العامة ، والتي يمكن تسميتها مباشرة بالخارج. في الوقت نفسه ، نظرًا لأن هذه الأساليب العامة محددة داخل الوظيفة ، يمكنهم استدعاء خصائصهم وطرقهم الخاصة. ومع ذلك ، يمكن للعالم الخارجي إكمال عمليات معينة فقط من خلال الأساليب والممتلكات العامة التي تم إرجاعها ، ولا يمكنها استدعاء خصائص مباشرة مثل Singleton.PrivateMethod1. هذا يجعل الكائن المتجانس ليس فقط عزل العالم الخارجي للوصول مباشرة إلى خصائصه وطرقه الخاصة ، ولكنه يوفر أيضًا بعض الخصائص والأساليب الشائعة للعالم الخارجي لإكمال عمليات معينة.
يستخدم هذا النمط المتجانس الذي تم إنشاؤه عن طريق التنفيذ الذاتي للوظائف المجهولة على نطاق واسع في العديد من مكتبات JS ، ولكن لا تزال هناك مشكلة. إذا لم نكن بحاجة إلى استخدام الكائن عند تحميل الصفحة ، وكان إنشاء الكائن أكثر تكلفة (مثل الكثير من الحسابات أو الوصول المتعدد إلى شجرة DOM وخصائصها ، وما إلى ذلك) ، فمن المعقول إنشاءه عند الحاجة إليه ، بدلاً من إنشاءه مباشرة مع تحليل وتنفيذ JS. يسمى هذا المفهوم التحميل كسول ، لذلك قم بتعديل الكود أعلاه على النحو التالي:
myspace.singleton = (function () {var requiredInstance ؛ function constructor () {var privateattribute1 = false ؛ var privateattribute1 = [1،2،3] ؛ function privateMethod1 () {} function privateMethod2 () {} return PrivateTtrict1 = PrivateMethod1 ؛هنا ، يتم تعريف متغير خاص فريد من نوعه في الوظيفة المجهولة كمقبض لتحديد ما إذا كان قد تم إنشاء كائن متجانس. بعد ذلك ، تم وضع جميع السمات والأساليب المحددة للكائن المتجانس في وظيفة تسمى مُنشئ. فقط عند استدعاء الوظيفة ، يمكن إنشاء كائن متجانس ، وإلا فلن يتم إنشاؤه مباشرة. بعد ذلك ، أعد كائنًا ، والذي يحتوي على طريقة getInstance ، مخصصة للمكالمات الخارجية. عند استدعاء الطريقة ، حدد أولاً ما إذا كان الكائن المتجانس موجودًا. إذا كان موجودًا ، فأعاده مباشرة. خلاف ذلك ، اتصل بوظيفة المنشئ لبناء الكائن المتجانس وإعادته. أخيرًا ، إذا أطلقنا على طريقة الكائن المتجانس ، فنحن بحاجة إلى استخدام myspace.singleton.getInstance (). publicmethod1 (). هنا ، سنقوم فقط بإنشاء هذا الكائن المتجانس عندما ندعو بهذه الطريقة ، وإلا فلن يتم إنشاء الكائن المتجانس تلقائيًا ، والذي ينفذ بالفعل التحميل عند الطلب أو التحميل كسول.