في JavaScript ، تخصص المتصفحات ، وخاصة المتصفحات على الأجهزة المحمولة ذاكرة محدودة للغاية ، وكيفية حفظ الذاكرة أصبحت شيئًا ذا معنى للغاية. طريقة فعالة لحفظ الذاكرة هي تقليل عدد الكائنات.
يقوم وضع وزن الذبابة (وزن الذبابة) بتشغيل تقنية المشاركة لدعم عدد كبير من الكائنات الدقيقة بشكل فعال ، وتجنب النفقات العامة لعدد كبير من الفئات الصغيرة مع نفس المحتوى (مثل استهلاك الذاكرة) ، والسماح للجميع بمشاركة فئة (metaclass).
يمكن أن يتجنب نمط الموسوعة كمية كبيرة من النفقات العامة من الطبقات المتشابهة للغاية. في البرمجة ، من الضروري في بعض الأحيان إنتاج عدد كبير من مثيلات الفصل الدقيقة لتمثيل البيانات. إذا تمكنت من العثور على أن هذه الحالات لها نفس النفقات العامة باستثناء بعض المعلمات ، فيمكنك تقليل عدد الفئات التي تحتاج إلى إنشاء مثيل لها بشكل كبير. إذا كان من الممكن نقل هذه المعلمات خارج مثيل الفئة وتم تمريرها عند استدعاء الطريقة ، يمكن تقليل عدد الحالات الفردية بشكل كبير عن طريق المشاركة.
هناك طريقتان لتطبيق وضع الموسوعة في JavaScript. الأول هو تطبيقه على طبقة البيانات ، وخاصة على عدد كبير من الكائنات المماثلة في الذاكرة ؛ والثاني هو تطبيقه على طبقة DOM ، يمكن استخدام الموسوعة في مدير الأحداث المركزي لتجنب إضافة مقابض الأحداث إلى كل عنصر طفل في الحاوية الأصل.
هناك مفهومين مهمين في وزن الذبابة - الدولة الداخلية الداخلية والخارجية الخارجية. تتم إدارة الحالة الداخلية من خلال الطرق الداخلية في الكائن ، ويمكن حذف المعلومات الخارجية أو حفظها خارجيًا.
بعبارة صريحة ، هو أولاً أن يقرص نموذجًا أصليًا ، ثم إنتاج نماذج محددة ذات خصائص مختلفة وفقًا للمناسبات والبيئات المختلفة. من الواضح ، يجب إنشاء كائنات جديدة مختلفة هنا ، لذلك يظهر وضع المصنع غالبًا في وضع وزن الذبابة. يتم استخدام الحالة الداخلية لوزن الذبابة للمشاركة. يعد مصنع ذبابة الوزن مسؤولاً عن الحفاظ على تجمع وزن الذبابة (تجمع الوضع) لتخزين الكائنات مع الحالة الداخلية.
يمكننا استبدال جميع الكائنات بنفس الحالة الداخلية بنفس الكائن المشترك ، ولإنشاء مثل هذا الكائن المشترك ، هناك حاجة إلى طريقة مصنع Singleton بدلاً من مُنشئ طبيعي. يمكن أن يتتبع ذلك الكائنات الفردية التي تم إنشاء مثيل لها ، بحيث لا يتم إنشاء كائن جديد إلا إذا كانت الحالة الداخلية للكائن المطلوب تختلف عن الكائن الموجود. يتم حفظ الحالة الخارجية للكائن في كائن المدير. عند استدعاء طريقة الكائن ، سيقوم المدير بتمرير هذه الحالات الخارجية كمعلمات.
احفظ بيانات كائن في كائنين مختلفين (كائن مشترك ، كائن المدير)
1. كائن مشترك (استمتع بالكائن الأصلي)
2. طريقة مصنع Singleton (إنشاء كائن مشترك)
3. كائن المدير (إدارة الحالة الخارجية)
على سبيل المثال ، يمكن تمثيل كتاب في المكتبة بواسطة كائن ، يحتوي على العديد من السمات.
var book = function (id ، title ، المؤلف ، النوع ، pagecount ، publisherid ، ISBN ، headoutdate ، checkoutmember ، duereturndate ، التوفر) {... // code} book.prototype = {getTitle: function () {return this.title ؛ } ، ... // تحديث طريقة حالة الإقراض updateCheckoutStatus: function (bookid ، newstatus ، headoutdate ، checkoutmember ، newReturnDate) {...} ، // reneft loan exteckoutperiod: function (bookid ، newReturndate) {...} ،قد يكون البرنامج على ما يرام في البداية ، ولكن مع مرور الوقت ، قد تزيد الكتب بكميات كبيرة ، وكل نوع من الكتب له إصدارات وكميات مختلفة ، ستجد أن النظام يزداد أبطأ وأبطأ. يمكن تخيل الآلاف من كائنات الكتب في الذاكرة ، ونحن بحاجة إلى استخدام وضع الموسوعة لتحسين.
يمكننا تقسيم البيانات إلى نوعين من البيانات. في نفس الكتاب ، يمكن أن تعزى البيانات المتعلقة بكائنات الكتب (العنوان ، المؤلف ، وما إلى ذلك) إلى الخصائص الداخلية ، في حين أن (CheckOutMember ، Duereturndate ، إلخ) يمكن أن تعزى إلى الخصائص الخارجية. وبهذه الطريقة ، يمكن للرمز التالي مشاركة نفس الكائن في نفس الكتاب ، لأنه بغض النظر عمن يقترض الكتاب ، طالما أن الكتاب هو نفس الكتاب ، فإن المعلومات الأساسية هي نفسها:
// كائن مشترك var book = function (العنوان ، المؤلف ، النوع ، pagecount ، publisherid ، ISBN) {this.title = title ؛ هذا. مؤلف = مؤلف ؛ this.genre = النوع ؛ this.pageCount = pageCount ؛ this.publisherid = publisherid ؛ this.isbn = isBn ؛} ؛دعنا نحدد مصنعًا أساسيًا للتحقق مما إذا كان كائن الكتاب قد تم إنشاؤه من قبل ، والعودة إذا كان هناك ، وإعادة إنشاءه وتخزينه حتى يتمكن من الاستمرار في الوصول لاحقًا ، مما يضمن إنشاء كائن واحد فقط لكل كتاب:
/* Book Factory Singleton*/var bookfactory = (function () {var nurnterbooks = {} ؛ return {createBook: function (title ، uptor ، النوع ، pagecount ، publisherid ، isBn) Book (المؤلف ، النوع ، Pagecount ، ISBN) ؛الحالة الخارجية بسيطة نسبيا. باستثناء الكتاب الذي قمنا بتغليفه ، يجب إدارة كل شيء آخر هنا:
/*bookrecordmanager singleton لإدارة الاقتراض*/var bookrecordmanager = (function () {var bookrecordDatabase = {} ؛ return {/*إضافة سجل اقتراض*/addBookRecord: function (id ، title ، upult ، pageCount ، publisherid ، isbn ، headoutdate ، BookFactory.createbook (العنوان ، النوع ، PageCount ، Publisherid ، ISBN) ؛ CheckoutDate ، NewReturnDate) BookRecordDatabase [bookid] .duereturndate = newReturnDate ؛وبهذه الطريقة ، قمنا بحفظ نفس المعلومات لنفس الكتاب في كائن BookManager وحفظنا نسخة واحدة فقط ؛ مقارنة بالرمز السابق ، يمكننا أن نجد أنه يحفظ الكثير من الذاكرة.
تجمع الأشياء
تجمع الكائنات هو حل آخر لتحسين الأداء ، والذي يحتوي على بعض أوجه التشابه مع وضع Xiangyuan ، ولكنه لا يفصل الحالة الداخلية والحالة الخارجية.
تنفيذ تجمع الكائنات العامة:
var ObjectPoolFactory = function (createObjfn) {var objectPool = [] ؛ // comple pool return {create: function () {// retrieve var obj = objectpool.length === 0؟ createObjfn.apply (هذا ، وسيطات): ObjectPool.shift () ؛ إرجاع OBJ ؛ } ، استرداد: الدالة (obj) {// استرداد objectpool.push (obj) ؛ }}} ؛الآن استخدم ObjectPoolFactory لإنشاء تجمع كائن يقوم بتحميل بعض الإطارات:
var iframefactory = objectPoolFactory (function () {var iframe = document.createElement ('iframe') ؛ document.body.appendChild (iframe) ؛ iframe.onload = function () {iframe.onload = null ؛ // منع bugs من تحميل iframefactory.recover (iframe) } ؛ // call var iframe1 = iframefactory.create () ؛ iframe1.src = 'http://www.qq.com' ؛المراجع: "نمط جافا سكريبت" "نمط تصميم جافا سكريبت وممارسة التطوير"
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.