Создать класс ES6 из функции

Я пытаюсь исследовать использование классов ES6 вместо того, как мы делаем это в настоящее время, используя средства Function.prototype. В настоящее время наш API выглядит так:

var myclass = createClass('MyClass', {
    test : function() {}
});

Мы выполняем итерацию по объекту и применяем эти свойства к возвращаемой функции, в основном более красивым способом, чем для того, чтобы он был более встроенным в другие языки программирования:

function MyClass() {}

MyClass.prototype.test = function() {};

Мы также кэшируем класс на объект, где имя является ключом, а функция - значением, используемым в нашем приложении. Имя класса может быть пространством имен, так что вы можете иметь My.Cls и он будет разделен на период, а затем кэшировать его на менеджер, но это также может быть получено через window.My.Cls,

Глядя на классы ES6, я не понимаю, как я могу сохранить createClass функция. Хотелось бы что-то вроде:

function createClass(name, config) {
    return class name config;
}

Я не ожидал, что это сработает, и это не так.

У меня есть два вопроса:

  1. Как я могу создать класс, используя переменную в качестве имени класса?
  2. Как я могу создать класс и назначить свойства через аргумент объекта конфигурации?

Не уверен, что это будет возможно. Мы не планируем держать createClassМы надеемся сохранить это на данный момент и обновить наши устаревшие "классы". Я хотел бы начать использовать классы ES6, но не ломать целое приложение так долго, как нам потребуется полная модернизация.

1 ответ

Решение

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

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

class Foo { ... }
class Bar { ... }

let classes = {'Foo': Foo, 'Bar': Bar};
function createClass(name, config) {
  if (classes[name]) {
    return classes[name];
  }
  // old impl
}

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

function createClass(name, config) {
  if (classes[name]) {
    return new classes[name](config);
  }
  // old impl
}

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

function createClass(name, config) {
  if (classes[name]) {
    let fields = Object.keys(config).filter(key => {
      return typeof config[key] !== 'function';
    }).map(key => config[key]);

    return new classes[name](fields);
  }
  // old impl
}
Другие вопросы по тегам