Создать класс 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;
}
Я не ожидал, что это сработает, и это не так.
У меня есть два вопроса:
- Как я могу создать класс, используя переменную в качестве имени класса?
- Как я могу создать класс и назначить свойства через аргумент объекта конфигурации?
Не уверен, что это будет возможно. Мы не планируем держать 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
}