Javascript: однострочное обращение к членам синглтона
Создал базовый класс - синглтон:
class ISingleton
{
static _instance: ISingleton;
constructor() {
if (ISingleton._instance)
return ISingleton._instance;
ISingleton._instance = this;
}
}
export class IEnvironment extends ISingleton
{
@observable ui: any = {}
constructor() {
super();
}
}
и его использование выглядит так:
const environment: IEnvironment = new IEnvironment();
func(environment.ui)
Подскажите можно ли его переделать так, чтобы можно было выполнять однострочные обращения к членам класса без new:
func(IEnvironment.getInstance().ui)
т.е. что-то на подобии работы со стандартным Object
Вообще привык что в том же C++ конструктор объявляется приватным и делается статический публичный метод getInstance(), который уже и создает объект синглтона
Можно ли такое же проделать в javascript?
А то реально нужно лишь однострочное обращение к члену синглтона, а приходится делать 2 строчную запись, да и лишняя для пользователя класса логика этот new как по мне.
Ответы (1 шт):
В TypeScript можно объявить конструктор приватным. Но нужно понимать, что на уровне JS все эти финтифлюшки будут проигнорированы.
Но раз вам нужно наследование, то лучше объявить конструктор protected и проверять экземпляр в конкретном классе, а не по всей цепочке наследования.
class Base {
protected constructor() {}
protected name: string = 'base';
say() {
console.log(`hi from ${this.name}!`);
}
private static _instance: Base;
static getInstance() {
if (!this.hasOwnProperty('_instance')) {
this._instance = new this;
}
return this._instance;
}
}
class Child extends Base {
name = 'child';
}
const c1 = Child.getInstance();
const c2 = Child.getInstance();
console.log(c1 === c2); // true
const b = Base.getInstance();
console.log(c1 === b); // false
b.say(); // hi from base!
c1.say(); // hi from child!