Реализация синглтона, наследование

Разбираю принцип синглтона
Не совсем понятно как работает код

function SomeFunction () {  // 1* 
     var instance;
        SomeFunction = function () {  // 2* 
           return instance;
        }
    SomeFunction.prototype = this; // 3* 
    instance = new SomeFunction ();
    instance.constructor = SomeFunction; // 4*
    instance.property1 = 'value';
    instance.property2 = 'value';
    return instance;
  }

1 - просто объявление функции
2 - это ссылка на саму функцию 1 что это за записи такая? она не переопределяет SomeFunction и все следующие вызовы после первого функция будет просто возвращать объект, верно?
3 - прототипом переменной SomeFunction устанавливается сама функ-я SomeFunction? - зачем нужна эта строка?
4 - понимаю что instance это объект конструктором которого становится SomeFunction, но не понятно зачем это делается?
Кто может объяснить эти записи?

Получится механика что при первом вызове функция SomeFunction создаст синглтон и вернет его, при последующих продолжит возвращать его.

Так как в 2 переопределили значение переменной, то и прототип переменной тоже изменился. Поэтому мы более не сможем получить верное значение a instance of SomeFunction, потому что instanceof смотрит в цепочку прототипов. Поэтому перед конструированием инстанса автор организует код так чтобы ``proto``` и SomeFunction.prototype были равны. Чтобы корректно отрабатывал instanceof.

По всем признакам эта строка лишняя. SomeFunction уже является конструктором instance. Код работает и без нее.

Оценка решения с моей стороны
Это решение слишком запутанное, лучше подбери что-нить попроще. Я писал статью с более простым для понимания подходами:

function Singletone () {
	if (Singletone.instance) {
		return Singletone.instance
	}
	Singletone.instance = this;
}

и накидываешь методы синглтона в прототип. Можно использовать замыкание для хранения инстанса вместо свойства конструктора. Сама статья: Синглтон на javascript

1 лайк

@pitline, http://www.dofactory.com/javascript/singleton-design-pattern - вот еще, на мой взгляд самый просто для понимания и запоминания, способ реализации сингтона на js

Суть моей реализации, в отличии от примера по ссылке, в том что все классы предполагают одинаковое конструирование через new, без необходимости отличать кто из них синглтон, и что для него надо вызвать метод у конструктора класса.

1 лайк