Как узнать, пришел ли экземпляр класса из Синглтона? - PullRequest
3 голосов
/ 11 июля 2019

Мне нужно оценить, пришел ли экземпляр класса из Singleton или нет?

Я знаю, что в JavaScript для создания Singleton мне нужно сохранить в конструкторе переменнуюinstance (имя может быть любым), сохраняющим this.

class Singleton {
  constructor() {
    const instance = this.constructor.instance;
    if (instance) return instance;
    this.constructor.instance = this;
  }
}

Но если у меня нет этого кода, и я просто возвращаю экземпляр класса, например:

let singletonOrMaybeNo = new Singleton()

И у меня просто есть singletonOrMaybeNo;

Как я могу узнать, является ли этот экземпляр синглтоном или нет?

Спасибо !!

Ответы [ 3 ]

3 голосов
/ 11 июля 2019

Вы можете проверить идентичность экземпляра с тем же конструктором.

class Singleton {
  constructor() {
    const instance = this.constructor.instance;
    if (instance) return instance;
    this.constructor.instance = this;
  }
}

class NoSingleton {
  constructor() {
  }
}


let singletonOrMaybeNo = new Singleton,
    other = new NoSingleton;

// works only with known constructor
console.log(singletonOrMaybeNo === new Singleton);

// takes the constructor from the instance (kudos to Jonas Wilms)
console.log(singletonOrMaybeNo === new singletonOrMaybeNo.constructor);

console.log(other === new other.constructor);
1 голос
/ 11 июля 2019

Понятие «синглтон-класс» происходит от языков, которые просто имеют классы (например, Java), однако JavaScript имеет гораздо больше, чем классы (объекты, функции, «глобальный код»), и поэтому нам не нужно подражать созданию единственного объекта с поддельным классом, мы можем просто сделать:

   const singleton = { some: 0, properties: 0 };
   // initialization goes here

Вы правы в том, что можно создать "синглтон-класс", но это не дает никаких преимуществ, оно просто добавляет шаблон и, на мой взгляд, затрудняет выполнение кода (как я и ожидал new Class) создать экземпляр, а не возвращать синглтон).

Чтобы проверить, приходит ли экземпляр из класса, который написан на вашем «шаблонном образе», вы можете просто проверить экземпляр:

   instance === instance.constructor.instance

Но я не уверен, что это вообще полезно. Это сомнительно, если вам действительно нужны эти классы, и если они вам действительно нужны, то у вас, вероятно, есть только несколько из них, и было бы гораздо меньше ошибок при проверке, является ли экземпляр instanceof одним из них:

  instance instanceof Singleton1 || instance instanceof Singleton2

Если ваши "синглтон-классы" не написаны вами, и вы знаете только, что они получены из функции конструктора, которая может возвращать существующие экземпляры, тогда единственный способ - создать новый экземпляр этого класса и проверить был ли возвращен тот же экземпляр:

  instance === new instance.constructor

Если конструктор, тем не менее, требует аргументов, то он сломается, или если это просто обычный экземпляр класса, вы создадите ненужный экземпляр, который может вызвать нежелательные побочные эффекты.

Так ведь: зачем тебе это?

1 голос
/ 11 июля 2019

instanceof вернет true, если объект является экземпляром класса:

class Singleton {
  constructor() {
    const instance = this.constructor.instance;
    if (instance) return instance;
    this.constructor.instance = this;
  }
}

let singletonOrMaybeNo = new Singleton();

console.log(singletonOrMaybeNo instanceof Singleton);
...