Реализация Singleton
Одиночка (англ. Singleton) — порождающий шаблон проектирования, гарантирующий, что в однопоточном приложении будет единственный экземпляр класса с глобальной точкой доступа.
Если открыть wiki, то можно увидеть 5 примеров реализации, нормальный из них только один :]
function Singleton() {
#!+ if (!Singleton.__instance) {
#! Singleton.__instance = this;
} else {
#! return Singleton.__instance;
#!- }
#! // Код конструктора
}
console.log(new Singleton === new Singleton); // true
Это классический способ, но в нем слишком много завязок на имя класса. Так что доведем его до логического конца и отвяжись от имени.
function Singleton() {
var self = this.constructor; // ссылка на Singleton
#!+ if (!self.__instance) {
#! self.__instance = this;
} else {
#! return self.__instance;
#!- }
#! // Код конструктора
}
console.log(new Singleton()); // [object Singleton] #! console.log(Singleton()); // undefined
function Singleton() {
#!+ "use strict"
#!- // остальной код
}
#!+ console.log(Singleton());
#!- // TypeError: Cannot read property 'constructor' of undefined
function Singleton() {
"use strict"
#!+ if (!(this instanceof Singleton)) {
#! return new Singleton;
#!- } else ...
}
#! console.log(Singleton()); // [object Singleton]
#! console.log(Singleton() === new Singleton()); // true
Как видите, мы решили проблемы, но опять пришлось завязаться на название функции.
function Singleton() {
#! return Singleton.prototype.init();
}
#!+ Singleton.prototype.init = function () {
#! // код конструктора
#! this.init = function () { return this; };
#! return this;
#!- }
#! console.log(Singleton() === new Singleton()); // true
Просто и красиво, но:
var foo = Singleton(); var bar = new Singleton(); #! console.log(foo instanceof Singleton); // false :[ #! console.log(bar instanceof Singleton); // false :[
function Singleton() {
return Singleton.prototype.init();
}
Singleton.prototype.init = function () {
// код конструктора
#! var _this = Object.create(this);
#!+ _this.init = function () { return this; };
#!- return _this;
}
#!+ var foo = Singleton();
#!- var bar = new Singleton();
#! console.log(foo === bar); // true
#! console.log(foo instanceof Singleton); // Bingo!
#! console.log(bar instanceof Singleton); // Combo!
Знаете ещё варинаты, присылайте мне на trash@rubaxa.org