Skip to content

Instantly share code, notes, and snippets.

@maplemap
Forked from DmitriiNazimov/pattern-singleton.js
Created July 19, 2020 09:35
Show Gist options
  • Save maplemap/fbcf829ce3397ea1388b3c10e8368dcd to your computer and use it in GitHub Desktop.
Save maplemap/fbcf829ce3397ea1388b3c10e8368dcd to your computer and use it in GitHub Desktop.
[JS Паттерн ОДИНОЧКА SINGLETON + синтаксис ООП ES6] #js #ООП #ES6 #Инкапсуляция #Паттерны
/**
*
* ПАТТЕРН SINGLETON
*
* Паттерн Одиночка гарантирует, что класс имеет только один экземпляр, и предоставляет глобальную точку доступа к этому экземпляру.
*
*/
var privateMethod = Symbol(); // Чтобы создать приватный метод приходится такую ерунду писать. Ничего лучше пока не придумали.
class Singleton {
static #instance = null; // Объявляем статическое приватное свойство. # - значит приватное.
constructor(num) {
if (Singleton.#instance) { // проверяем что значение #instance не равно null (т.е. уже что-то присвоено), и прерываем инструкцию, чтобы в соответствии с принципом синглтон сохранить значения присвоенные при первой инициации.
return Singleton.#instance;
}
this.state = "justtext";
Singleton.#instance = this;
this.publicMethod(num); // автовызов публичного метода в конструкторе. Можно не вызывать в конструкторе, а только вручную
this[privateMethod]() // call private
}
publicMethod(num='default string ') { // Публичный метод с примером дефолтного значения аргумента.
console.log('publicMethod: ' + num + this.state);
}
[privateMethod]() { // Приватный метод, т.е. его нельзя вызывать вне класса.
console.log('privateMethod:' + this.state + this.state);
}
}
let first = new Singleton('first');
Singleton.instance = 0; // Попытка внести изменения в приватное свойство не сработает, оно инкапсулировано.
let second = new Singleton('second');
second.privateMethod(); // Попытка вызвать приватный метод не сработает.
let third = new Singleton('3');
console.log(first === third);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment