Singleton может быть далее по коду переопределен теоретически:
// ...
Singleton = function() {};
let singleton3 = new Singleton(); // Singleton {}
О нет, моя прекрасная логика! У нас теперь 2 экземпляра класса фактически в рамках одного приложения. Есть один выход, но класс Singletone станет "грязной" функцией, которая будет обращаться к переменным внешнего контекста:
Singletone = function(foo) {
this.foo = foo;
Singletone = Function;
Object.defineProperty(global, 'Singletone', {writable: false});
};
Допустим, мы находимся в среде nodejs, где глобальным объектом выступает "global". Здесь я не ставлю var перед Singletone, поэтому из любого участка он всплывет, и станет свойством глобального объекта, которое уже мы можем запретить перезаписывать (после первого исполнения). Как-то так