представлять
Начиная с этой главы, мы постепенно представим различные реализации дизайна, используемые в JavaScript. Здесь я не буду вводить слишком много теорий самого шаблона, но сосредоточу только на реализации. ОК, официально начнется.
В глазах традиционных инженеров по разработке, синглтон должен гарантировать, что есть только один экземпляр класса. Метод реализации, как правило, должен сначала определить, существует ли экземпляр или нет. Если он существует, он будет возвращен непосредственно, и если он не будет существовать, он будет создан и затем возвращен, что гарантирует, что существует только один объект экземпляра класса. В JavaScript Singleton выступает в качестве поставщика пространства имен, предоставляя уникальную точку доступа от глобального пространства имен для доступа к объекту.
текст
В JavaScript есть много способов внедрить одиноких. Самый простой способ - использовать буквальный объект, который может содержать большое количество свойств и методов:
Кода -копия выглядит следующим образом:
var mysingleton = {
Property1: «Что -то»,
Property2: «Что -то еще»,
Метод1: function () {
console.log («Привет, мир»);
}
};
Если вы хотите расширить объект позже, вы можете добавить своих собственных частных членов и методов, а затем использовать закрытие для инкапсуляции этих переменных и объявлений функций внутри него. Только публичные члены и методы, которые вы хотите разоблачить, выставлены. Пример кода заключается в следующем:
Кода -копия выглядит следующим образом:
var mysingleton = function () {
/* Объявите частные переменные и методы здесь*/
var privateVariable = 'Что -то частное';
функция showprivate () {
console.log (privateviable);
}
/ * Общественные переменные и методы (доступ к частным переменным и методам) */
возвращаться {
publicmethod: function () {
ShowPrivate ();
},
publicvar: «Публика может это увидеть!»
};
};
var single = mysingleton ();
single.publicmethod (); // вывод «что -то частное»
console.log (single.publicvar); // Вывод 'Общественность может это увидеть!
Приведенный выше код довольно хорош, но что, если мы хотим сделать его инициализированным только тогда, когда мы его используем? В целях сохранения ресурсов мы можем инициализировать эти коды в другом конструкторе следующим образом:
Кода -копия выглядит следующим образом:
var singleton = (function () {
var создается;
function init () {
/*Определите код синглтона здесь*/
возвращаться {
publicmethod: function () {
console.log («Привет, мир»);
},
publicproperty: 'test'
};
}
возвращаться {
GetInstance: function () {
if (! commandited) {
indantied = init ();
}
вернуть создание;
}
};
}) ();
/*Вызов общедоступного метода, чтобы получить экземпляр:*/
Singleton.getinstance (). Publicmethod ();
Я знаю, как реализовать одиноких, но какой сценарий является лучшим сценарием для использования синглтонов? Фактически, синглтоны обычно используются для координации связи между различными режимами между системами. Следующий код является лучшей практикой для синглтона:
Кода -копия выглядит следующим образом:
var singletontester = (function () {
// Параметр: набор параметров, передаваемых в синглтон
функция Singleton (args) {
// Установите переменную args в полученный параметр или быть пустым (если не предоставлена)
var args = args || {};
// Установить параметры имени
this.name = 'singletontester';
// Установить значение точки
this.pointx = args.pointx || 6; // получить из полученных параметров или установить значение по умолчанию
// Установить значение заостренного
this.pointy = args.pointy || 10;
}
// контейнер экземпляра
экземпляр var;
var _static = {
Имя: 'Singletontester',
// метод получить экземпляр
// вернуть экземпляр Синглтона
GetInstance: function (args) {
if (экземпляр === не определен) {
exants = new Singleton (args);
}
вернуть экземпляр;
}
};
вернуть _static;
}) ();
var singletontest = singletontester.getinstance ({pointx: 5});
console.log (singletontest.pointx); // Вывод 5
Другие методы реализации
Метод 1:
Кода -копия выглядит следующим образом:
функция Universe () {
// определить, есть ли экземпляр
if (typeof Universe.instance === 'Object') {
вернуть вселенную. INSTANCE;
}
// другой контент
this.start_time = 0;
this.bang = "big";
// кэш
Universe.Instance = это;
// неявно вернуть это
}
// тест
var uni = new Universe ();
var uni2 = new Universe ();
console.log (uni === uni2); // истинный
Метод 2:
Кода -копия выглядит следующим образом:
функция Universe () {
// экземпляр кэша
var encess = this;
// другой контент
this.start_time = 0;
this.bang = "big";
// переписать конструктор
Universe = function () {
вернуть экземпляр;
};
}
// тест
var uni = new Universe ();
var uni2 = new Universe ();
Uni.bang = "123";
console.log (uni === uni2); // истинный
console.log (Uni2.bang); // 123
Метод 3:
Кода -копия выглядит следующим образом:
функция Universe () {
// экземпляр кэша
экземпляр var;
// восстановить функцию
Universe = функция Universe () {
вернуть экземпляр;
};
// Пост-обработка свойств прототипа
Universe.Prototype = this;
// Пример
encess = new Universe ();
// сбросить указатель конструктора
exance.constructor = ulinea;
// другие функции
exants.start_time = 0;
ancess.bang = "big";
вернуть экземпляр;
}
// тест
var uni = new Universe ();
var uni2 = new Universe ();
console.log (uni === uni2); // истинный
// Добавить свойства прототипа
Universe.prototype.nothing = true;
var uni = new Universe ();
Universe.prototype. everything = true;
var uni2 = new Universe ();
console.log (Uni.nothing); // истинный
console.log (Uni2.nothing); // истинный
console.log (Uni. Все); // истинный
console.log (Uni2. Все); // истинный
console.log (uni.constructor === Universe); // истинный
Метод 4:
Кода -копия выглядит следующим образом:
var Universe;
(function () {
экземпляр var;
Universe = функция Universe () {
if (экземпляр) {
вернуть экземпляр;
}
экземпляр = это;
// другой контент
this.start_time = 0;
this.bang = "big";
};
} ());
// тестовый код
var a = new Universe ();
var b = new Universe ();
предупреждение (a === b); // истинный
A.Bang = "123";
бдительность (B.Bang); // 123