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
Суть моей реализации, в отличии от примера по ссылке, в том что все классы предполагают одинаковое конструирование через new, без необходимости отличать кто из них синглтон, и что для него надо вызвать метод у конструктора класса.