среда, 23 апреля 2014 г.

JavaScript Singleton - хороший пример

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

Комментариев нет:

Отправить комментарий