1. Используйте глобальные переменные для сохранения отдельных случаев
Это самый простой способ его реализовать
function person () {this.createtime = new Date (); } var encess = new Person (); function getInstance () {return Encement; }При загрузке этого JS объект человека создается и сохраняется в глобальной переменной экземпляра. Этот объект принимается каждый раз, когда он используется. Если вы не использовали его один раз, созданный вами объект потрачен впустую, мы можем оптимизировать его.
функция экземпляра var getInstance () {if (! Encement) {exance = new Person (); } return Encement; }Таким образом, объект создается только тогда, когда он используется в первый раз.
Недостатком этого метода является то, что экземпляр является глобальной переменной. Когда несколько человек сотрудничают или цикл разработки относительно длинный, трудно гарантировать, что экземпляр не будет изменен или перезаписывается другими кодами. Весьма вероятно, что когда вызов называется, обнаружено, что экземпляр вообще не является человеком.
Давайте рассмотрим использование закрытия для инкапсуляции экземпляра, чтобы он больше не была глобальной переменной для решения этой проблемы.
2. Объект создания закрытия
var getInstance () {var Encement; return function () {if (! Encement) {encement = new Person (); } return Encement; }} ();Таким образом, экземпляр инкапсулируется, и нет необходимости беспокоиться о том, чтобы быть измененным.
Теперь вы можете получить синглтон через функцию GetInstance (). Новый вопрос, если я создаю объект через New Person (), я все равно получаю несколько объектов, и JavaScript не может приватизировать конструктор, как Java. Итак, как мы можем сделать новые объекты, которые являются новыми, являются экземпляром?
3. Статический экземпляр кэша атрибутов конструктора
Сначала посмотрите на код
function person () {// Если экземпляр был кэширован, он напрямую вернет кэшированный экземпляр, если (typeof person.instance === 'object') {return person.instance; } this.createtime = new Date (); // кэшированный экземпляр person.instance = this; вернуть это; }Из кода мы видим, что первый раз, когда новое, условие, если вернуть false, спустится, инициализируется объект, а затем сохранит объект в статическом Pertion. INSTANCE.
Второй раз, когда новый, условие, если вернуть True, непосредственно возвращает Person.Instance, и инициализированный код не будет запущен. Так что независимо от того, сколько раз новая, возвращаемый объект является первым созданным объектом.
Недостатки этого метода совпадают с методом первого. Человек. Использование также является государственной собственностью и может быть изменено.
Давайте обратимся к методу 2. Используя закрытие для инкапсуляции, можно решить проблему
4. Перепишите конструктор
Этот метод должен использовать закрытие, но он не может быть таким же простым, как метод второй. Нам нужно переопределить конструктор.
function person () {// кэшированный экземпляр var exance = this; this.createtime = new Date (); // Перепишите конструктор Person = function () {return Encement; }}В первый раз, когда новый, первоначальный конструктор сначала кэшируется, а затем инициализируется, а конструктор переопределен. Когда в будущем новый конструктор никогда не будет вызван, а конструктор переписывания может быть вызван только, и эта функция всегда возвращает кэшированный экземпляр.
Приведенный выше метод, кажется, в порядке, но с помощью следующего теста вы можете найти проблему
// Добавить атрибут Person.prototype.prop1 = true; var p1 = новый человек (); // После создания объекта инициализации добавьте атрибут person.prototype.prop2 = true; var p2 = новый человек (); // начальный тестовый консоль.log (p1.prop1); // Результатом является истинная консоль.log (p2.prop1); // Результатом является истинную консоль.log (p1.prop2); // Результат не определяется. console.log (p1.constructor === Person); // Результатом является false console.log (p2.constructor === Person); // Результат является ложным
Ожидаемые результаты должны быть правдой.
Проанализируйте вышеуказанный тестовый код
Person.prototype.prop1 = true; Добавляет атрибут ProP1 под прототипом исходного конструктора и присваивает значение.
После выполнения var p1 = new Person ();, конструктор лица был переписан
Следовательно, Person.prototype.prop2 = true; Добавляет свойство Prop2 под новым прототипом.
var p2 = новый человек (); P2 и P1 на самом деле являются одним и тем же объектом, то есть объектом, созданным исходным конструктором
Таким образом, P1 и P2 имеют Proper Prop1, но нет свойства Prop2
Точно так же конструктор P1 и P2 также указывает на исходный конструктор, а человек больше не является исходной функцией в настоящее время.
Чтобы запустить, как и ожидалось, могут быть достигнуты некоторые модификации
function person () {// кэшированный экземпляр var exance = this; // Переписать конструктор Person = function () {return Encement; } // резервировать атрибут Prototype Person.prototype = this; // экземпляр = новый человек (); // сбросить ссылочный экземпляр конструктора.constructor = Person; // Другое экземпляр инициализации.createtime = new Date (); вернуть экземпляр; }Запустите предыдущий тестовый код, и результат верен.
5. ленивая загрузка:
В крупных или сложных проектах он играет оптимизационную роль: компоненты, которые дороги, но редко используются, могут быть заверены в ленивые синглтоны, примеры программ:
/ * Singleton с частными участниками, шаг 3. */Mynamespace.singleton = (function () {// частные члены. Var privateattribute1 = false; var privateattribute2 = [1, 2, 3]; function privatemethod1 () {...} function2: 2: 2: 2: 2: 2: 2: 2: 2: 2: 2: 2: 2: publicmethod1: function () {...}, publicmethod2: function (args) {...}};}) ();/ * Общий скелет для ленивого нагрузочного синглтона, шаг 1.//mynamespace.singleton = (function () {Function Contructor () {// Все нормальный код Singleton здесь. PrivateAttribute2 = [1, 2, 3]; Lazy загружать Singleton, шаг 2. */mynamespace.singleton = (function () {function constructor () {// Все обычный код Singleton идет здесь. ...} return {getInstance: function () {// Код управления идет здесь.}}}) ();/ *Общие скелетон для Lazy Lazy Lazysing Singleton, step 3. (function () {var uniqueInstance; // Приватный атрибут, который содержит единственный экземпляр. Функция Constructor () {// Весь нормальный код Singleton Goes ЗДЕСЬ. ...} return {getInstance: function () {if (! Уникальный instance) {// создание экземпляра только в том случае, если экземпляр.6. Используйте Branch Singleton:
Код для конкретной среды может быть завершен в разветвленный синглтон, образец программы:
/ * Simplexhrfactory singleton, step 1. */Var simplexhrfactory = (function () {// Три ветви. }}; Xmlhttprequest (); Попробуйте каждый метод; ActiveXold.createxhrobject ();