Cоздадим реализацию Singleton, которая:
- инкапсулирует данные
- не создает объект, если конструктор не был вызван
- позволяет использовать все инструменты прототипного наследования (constructor, Singleton.prototype, instanceof)
- может вызываться как с new, так и без
var Singleton = (function () {
var instance;
return function ConstructSingleton () {
if (instance) {
return instance;
}
if (this && this.constructor === ConstructSingleton) {
instance = this;
} else {
return new ConstructSingleton();
}
}
})();
Разберем что происходит в возвращаемой функции.
Если есть instance, то возвращаем его.
Если функция используется с new или без, то все равно мы вернем ссылку на объект, сконструированный этой функцией.
Если функция вызвана с new, то this ссылается на объект, конструируемый этой функцией.
this так же может быть определен, если функция вызвана в нестрогом режиме (this === window), или, если функция вызвана как метод объекта (this === этот_объект). Второй случай аннигилируется проверкой конструктора у this.
Если this не определен (вызов в строгом режиме) или конструктор у this не текущая функция, возвращаем результат текущей функции с new.
Имеем на выходе пуленепробиваемый конструктор синглтона, который можно где угодно хранить и как угодно вызывать.
Набор других паттернов можно найти в хранилище github.com/podgorniy/javascript-toolbox
Комментариев нет:
Отправить комментарий