В качестве модели разработки программного обеспечения монолитный шаблон широко использовался во многих объектно-ориентированных языках. В 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 и традиционными объектно-ориентированными языками. Этот метод проще и проще для понимания. Однако этот метод имеет несколько недостатков. Одним из очевидных недостатков является то, что он не предоставляет пространство имен. Если другие программисты также определяют синглтонскую переменную на странице, легко перезаписать и запутать монолитный объект. Итак, для этой проблемы это переписано следующим образом:
var myspace = {}; myspace.singleton = {attribute1: true, attribute2: 10, method1: function () {}, method2: function (arg) {}}Здесь сначала определяется пространство имен MySpace, а затем синглтон единого объекта установлен под этим объектом, что значительно снижает возможность конфликтов с другими программистами и неправильно. Даже если другие определят синглтонскую переменную в глобальной области, она не загрязняет объект Singleton. Это реализует функцию деления пространства имен и организации некоторых связанных атрибутов и методов, как упомянуто в предыдущем определении.
Этот метод все еще имеет свои недостатки. Все свойства и методы этого монолитного объекта обмениваются и могут быть доступны и изменены в любое время извне. Следовательно, закрытие используется для моделирования частных свойств и методов, следующим образом:
myspace.singleton = (function () {var privateattribute1 = false; var privateattribute1 = [1,2,3]; function privatemethod1 () {} function privatemethod2 () {} return {publicattribute1: true, publicattrube2: 10, publicmethod1: function () {privateatribut1 = trueDem; publicmethod2: function (arg) {privateattribute1 = [4,5,6];Здесь мы непосредственно назначаем анонимную функцию самостоятельного выполнения объекту монолита. В этой функции ключевые слова VAR и функции используются для определения его личных свойств и методов соответственно. Они не могут быть непосредственно доступны вне функции (вне объекта монолита), потому что после выполнения функции пространство его внутренней области будет переработано, поэтому закрытие может использоваться для имитации частных свойств и методов. В этой функции (закрытие), наконец, возвращается объект, который содержит некоторые публичные методы и свойства, которые можно назвать непосредственно за пределами. В то же время, поскольку эти публичные методы определяются внутри функции, они могут назвать свои личные свойства и методы. Тем не менее, внешний мир может завершить определенные операции только с помощью возвращенных публичных методов и свойств, и не может напрямую вызывать свойства, такие как Singleton.privatemethod1. Это делает монолитный объект не только изолировать внешний мир для непосредственного доступа к его частным свойствам и методам, но также предоставляет некоторые общие свойства и методы для внешнего мира для выполнения определенных операций.
Этот монолитный паттерн, построенный в результате самооценки анонимных функций, широко используется во многих библиотеках JS, но все еще есть проблема. Если нам не нужно использовать объект при загрузке страницы, а создание объекта является более дорогостоящим (например, множество расчетов или множественный доступ к дереву DOM, его свойствам и т. Д.), Это разумно создавать его, когда он необходим, а не напрямую создавать его с помощью парирования и выполнения JS. Эта концепция называется ленивой загрузкой, поэтому измените приведенный выше код следующим образом:
myspace.singleton = (function () {var uniqueinstance; function constructor () {var privateattribute1 = false; var privateattribute1 = [1,2,3]; function privatemethod1 () {} function privatemethod2 () {} return {publicattribute1: true, publicattruble2: 10, publicTyd1:) PrivateAttribute1 = True;Здесь частная переменная уникальная инстановка определяется в анонимной функции как рукоятка, чтобы определить, был ли создан монолитный объект. Затем все атрибуты и методы, определенные для монолитного объекта, были помещены в функцию, называемую конструктором. Только когда функция называется монолитный объект создан, в противном случае он не будет создан напрямую. Затем верните объект, который содержит метод GetInstance, который предназначен для внешних вызовов. При вызове метода сначала определите, существует ли монолитный объект. Если он существует, верните его напрямую. В противном случае вызовите функцию конструктора, чтобы построить монолитный объект и вернуть его. Наконец, если мы называем метод монолитного объекта, нам нужно использовать myspace.singleton.getinstance (). Publicmethod1 (). Здесь мы создадим этот монолитный объект только тогда, когда вызовываем это, в противном случае монолитный объект не будет создан автоматически, что фактически реализует загрузку по требованию или ленивую загрузку.