представлять
Режим вылета (выпускной вес) запускает технологию совместного использования для эффективной поддержки большого количества мелкозернистых объектов, избегая накладных расходов большого количества небольших классов с тем же контентом (например, потребление памяти) и позволяя каждому делиться классом (MetaClass).
Схема энциклопедии может избежать большого количества накладных расходов очень похожих классов. При программировании иногда необходимо создать большое количество мелкозернистых экземпляров класса для представления данных. Если вы можете обнаружить, что эти экземпляры имеют в основном одинаковые накладные расходы, за исключением нескольких параметров, вы можете значительно уменьшить количество классов, которые необходимо создать. Если эти параметры могут быть перемещены за пределы экземпляра класса и передавать их при вызове метода, количество отдельных экземпляров может быть значительно уменьшено путем обмена.
Так что, если вы примените режим энциклопедии в JavaScript? Есть два способа. Во -первых, применить его к уровню данных, в основном к большому количеству аналогичных объектов в памяти; Второе - применить его к слою DOM, который можно использовать в центральном менеджере событий, чтобы избежать добавления ручек событий к каждому дочернему элементу в родительском контейнере.
Наслаждайтесь уровнем данных
Существует две важные понятия во внутреннем и внешнем состоянии внутреннего состояния. Внутреннее состояние управляется внутренними методами в объекте, а внешняя информация может быть удалена или сохранена снаружи.
Говоря о том, чтобы сначала ущипнуть оригинальную модель, а затем создать конкретные модели с различными характеристиками в зависимости от различных случаев и сред. Очевидно, что здесь необходимо генерировать разные новые объекты, поэтому в режиме полусреднего веса часто появляется заводский режим. Внутреннее состояние вылета используется для обмена. Фабрика в полусреднем весе отвечает за поддержание бассейна в полусреднем весе (пул режима) для хранения объектов с внутренним состоянием.
Используйте режим удовольствия
Давайте продемонстрируем, что если система использует библиотеку классов для управления всеми книгами, метаданные каждой книги предварительно устанавливаются на следующий контент:
Кода -копия выглядит следующим образом:
ИДЕНТИФИКАТОР
Заголовок
Автор
Жанр
Подсчет страниц
Идентификатор издателя
ISBN
Нам также необходимо определить время и заемщик каждой книги, а также дату возврата и наличие оно доступно:
Кода -копия выглядит следующим образом:
CACKOUTDATE
Checkoutmember
Duereturndate
доступность
Поскольку объект книги установлен на следующий код, обратите внимание, что код еще не был оптимизирован:
Кода -копия выглядит следующим образом:
var book = function (id, название, автор, жанр, pagecount, publisherid, isbn, cakeoutdate, cakeoutmember, duereturndate, доступность) {
this.id = id;
this.title = заголовок;
this.author = автор;
this.genre = жанр;
this.pagecount = pagecount;
this.publisherid = publisherid;
this.isbn = isbn;
this.checkoutdate = cakeOutdate;
this.checkoutmember = cackoutmember;
this.duereturndate = duereturndate;
this.vailability = доступность;
};
Book.prototype = {
getTitle: function () {
вернуть это.title;
},
getAuthor: function () {
вернуть это.author;
},
getisbn: function () {
вернуть это .исбн;
},
/*Другие методы получения не будут отображаться здесь*/
// Обновление статуса кредитования
UpdateCheckoutStatus: Function (BookId, NewStatus, CakeOutdate, Checkoutmember, NewReturnDate) {
this.id = bookid;
this.vailability = newStatus;
this.checkoutdate = cakeOutdate;
this.checkoutmember = cackoutmember;
this.duereturndate = newreturndate;
},
// Обновление
extendcheckoutperiod: function (bookid, newreturndate) {
this.id = bookid;
this.duereturndate = newreturndate;
},
// это истек
iSpastDue: function (bookId) {
var currentDate = new Date ();
return TackDate.getTime ()> date.parse (this.duereturndate);
}
};
Программа может быть в порядке в начале, но со временем книги могут увеличиваться в больших количествах, и каждый тип книги имеет разные версии и количества, вы обнаружите, что система становится медленнее и медленнее. Тысячи книжных объектов можно представить в памяти, и нам нужно использовать режим энциклопедии для оптимизации.
Мы можем разделить данные на два типа внутренних и внешних данных. Данные, связанные с объектами книги (заголовок, автора и т. Д.), Можно отнести к внутренним свойствам, в то время как (Checkoutmember, Duereturndate и т. Д.) Могут быть связаны с внешними свойствами. Таким образом, следующий код может поделиться одним и тем же объектом в одной и той же книге, потому что независимо от того, кто заимствует книгу, если книга такая же книга, основная информация такая же: такая же: такая же:
Кода -копия выглядит следующим образом:
/*Код оптимизации режима Xienyuan*//
var book = function (заголовок, автор, жанр, pagecount, publisherid, isbn) {
this.title = заголовок;
this.author = автор;
this.genre = жанр;
this.pagecount = pagecount;
this.publisherid = publisherid;
this.isbn = isbn;
};
Определение базовой фабрики
Давайте определим основную фабрику, чтобы проверить, был ли объект книги создан ранее, вернемся, если есть, и воссоздать и хранить ее, чтобы он мог продолжать доступ позже, что гарантирует, что мы создаем только один объект для каждой книги:
Кода -копия выглядит следующим образом:
/* Книжная фабрика Singleton*/
var bookfactory = (function () {
var существующие книги = {};
возвращаться{
CreateBook: функция (название, автор, жанр, PageCount, Publisherid, ISBN) {
/*Поиск, чтобы создать до*/
var существующий книга = существующие книги [ISBN];
if (существующий книга) {
вернуть существующую книгу;
}еще{
/ * Если нет, создайте один и сохраните */
var book = новая книга (название, автор, жанр, ярость, издательство, ISBN);
Существующие книги [ISBN] = книга;
возвращение книги;
}
}
}
});
Управлять внешним статусом
Внешнее состояние относительно простое. За исключением книги, которую мы инкапсулировали, здесь нужно управлять всем остальным:
Кода -копия выглядит следующим образом:
/*BookRecordManager Singleton для заимствования управления*/
var bookrecordmanager = (function () {
var bookRecordDatabase = {};
возвращаться{
/*Добавить книгу заимствования записи*/
addBookRecord: функция (ID, заголовок, автор, жанр, PageCount, Publisherid, ISBN, CheckOutdate, Checkoutmember, Duereturndate, доступность) {
var book = bookfactory.createbook (название, автор, жанр, ячеечник, издательский, ISBN);
bookRecordDatabase [id] = {
Checkoutmember: Checkoutmember,
CACKOUTDATE: CACKOUTDATE,
Duereturndate: Duereturndate,
Доступность: доступность,
Книга: книга;
};
},
UpdateCheckoutStatus: Function (BookId, NewStatus, CakeOutdate, Checkoutmember, NewReturnDate) {
var record = bookRecordDatabase [bookId];
record.vailability = newStatus;
record.checkoutdate = cakeOutdate;
record.checkoutmember = cakeoutmember;
record.duereturndate = newreturndate;
},
extendcheckoutperiod: function (bookid, newreturndate) {
bookRecordDatabase [bookId] .duereturnDate = newReturnDate;
},
iSpastDue: function (bookId) {
var currentDate = new Date ();
return TackDate.getTime ()> date.parse (bookRecordDatabase [bookid] .duereturndate);
}
};
});
Таким образом, мы сохранили ту же информацию одной и той же книги в объекте Bookmanager и сохранили только одну копию; По сравнению с предыдущим кодом, мы можем обнаружить, что он сохраняет много памяти.
Наслаждайтесь режимом юаня и DOM
Я не скажу много об инциденте DOM здесь. Я верю, что все уже это знают. Давайте приведем два примера.
Пример 1: Централизованное управление событиями
Например, если нам нужно отслеживать его событие Click для многих подобных элементов или структур (таких как меню или несколько LI в UL), то нам нужно связывать события для каждого элемента. Если есть очень много элементов, то можно представить себе производительность. В сочетании со знанием пузырьков, если какой -либо дочерний элемент запускается, событие будет пузыриться до элемента предыдущего уровня после запуска триггера. Поэтому, используя эту функцию, мы можем использовать режим энциклопедии, мы можем отслеживать события событий в родительских элементах этих аналогичных элементов, а затем судить, какой у детей элемент запускается событие, а затем выполнять дальнейшие операции.
Здесь мы комбинируем метод jQuery Bind/Unbind, чтобы привести пример.
HTML:
Кода -копия выглядит следующим образом:
<div id = "контейнер">
<div href = "#"> больше информации (адрес)
<span>
Вот больше информации
</span> </div>
<div href = "#"> больше информации (карта)
<span>
<iframe src = "http://www.map-generator.net/extmap.php?name=london&address=london%2C%20england&width=500...gt;" </iframe>
</span>
</div>
</div>
JavaScript:
Кода -копия выглядит следующим образом:
stateManager = {
Fly: function () {
var self = это;
$ ('#container'). unbind (). bind ("click", function (e) {
var target = $ (e.originaltarget || e.srcelement);
// определить, какой это дочерний элемент
if (target.is ("div.toggle")) {
self.handleclick (цель);
}
});
},
handleclick: function (elem) {
elem.find ('span'). Toggle ('Slow');
}
});
Пример 2: Применение режима энциклопедии для повышения производительности
Другой пример по -прежнему связан с jQuery. Как правило, мы используем объекты элементов в функции обратного вызова событий. Мы часто используем форму $ (это). На самом деле, он неоднократно создает новый объект, потому что это в функции обратного вызова уже является самим элементом DOM. Мы должны использовать следующий код:
Кода -копия выглядит следующим образом:
$ ('div'). bind ('click', function () {
console.log ('вы нажали:' + $ (this) .attr ('id'));
});
// Следует избегать приведенного выше кода и снова избегать генерации объектов jQuery в элементе DOM, потому что вы можете напрямую использовать сам элемент DOM.
$ ('div'). bind ('click', function () {
console.log ('Вы нажали:' + this.id);
});
Фактически, если нам нужно использовать форму $ (this), мы также можем реализовать нашу собственную версию шаблона единого экземпляра, например, мы можем реализовать функцию, такую как jQuery.Signle (это), чтобы вернуть сам элемент DOM:
Кода -копия выглядит следующим образом:
jquery.single = (function (o) {
VAR Collection = jQuery ([1]);
возврат функции (элемент) {
// Поместите элементы в коллекцию
Сбор [0] = элемент;
// Вернуться в коллекцию
вернуть коллекцию;
};
});
Как использовать:
Кода -копия выглядит следующим образом:
$ ('div'). bind ('click', function () {
var html = jquery.single (this) .next (). html ();
console.log (html);
});
Таким образом, сам элемент DOM возвращается как есть, и объект jQuery не создан.
Суммировать
Режим вылета - это режим, который повышает эффективность и производительность программы, который значительно ускорит скорость работы программы. Существует много сценариев приложений: например, если вы хотите прочитать серию строк из базы данных, многие из этих строк повторяются, то мы можем хранить эти строки в пуле в весе (бассейн).
Если приложение использует большое количество объектов, и это большое количество объектов вызывает отличное хранилище, вам следует рассмотреть возможность использования режима энциклопедии; и большинство состояний объектов могут быть внешними. Если внешнее состояние объекта удаляется, многие группы объектов могут быть заменены относительно небольшим количеством общих объектов. В настоящее время вы можете рассмотреть возможность использования режима энциклопедии.