Могу ли я контролировать, как создается класс в ES6? - PullRequest
0 голосов
/ 05 июня 2019

В Python3 я могу использовать магическую функцию __new__, которая выполняется перед инициализацией класса. Это помогает мне контролировать, будет ли создан новый экземпляр или мы будем использовать какой-то экземпляр из кэша.

Просто немного упрощенный пример:

class Something:
    def __new__(..., someArgument):
       # was a class with someArgument initialized somewhere before?
       # is yes, then:
           return CACHE[someArgument]
       # if no, then:
           CACHE[someArgument] = Something(someArgument)
           return CACHE[someArgument]

Итак, могу ли я сделать то же самое в ES6? Или как я могу управлять инициализацией класса другим способом?

Этот вопрос не является дубликатом этого , потому что я спрашиваю, могу ли я найти какую-то функциональность в JS, в то время как в приведенной выше теме содержится обсуждение этой функциональности.

Ответы [ 3 ]

2 голосов
/ 05 июня 2019

Вы можете использовать заводские функции:

class Test {

}

function getInstance() {
  if (!Test._instance) {
    Test._instance = new Test();
  }

  return Test._instance;
}
2 голосов
/ 05 июня 2019

Нет, когда (не производный) конструктор вызывается с new (или super()), тогда объект уже создается до того, как любой пользовательский код выполнит 1 . Однако JS позволяет перезаписать значение результата выражения, return извлекая объект из конструктора. Вы можете написать

const CACHE = new Map();
class Something {
    constructor(someArgument) {
        if (CACHE.has(someArgument)) return CACHE.get(someArgument);
//                                   ^^^^^^
        CACHE.set(someArgument, this);
        // initialise `this`
    }
}

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

1: он может быть перехвачен ловушкой construct прокси-сервера, но вы обычно не используете это.

2 голосов
/ 05 июня 2019

Как прокомментировал Джастинас, вы можете посмотреть примерно Javascript Factory.

A Javascript Factory, определяющий интерфейс для создания объекта, но позволяющий подклассам решать, какой класс создавать.Factory Method позволяет классу отложить создание экземпляров для подклассов.

В некоторых местах вы можете найти его:

Шаблон проектирования метода фабрики

Заводские функции с ES6

Вызов Javascript Factory Method

Надеюсь, это помогло!

...