2015-05-11 4 views
1

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

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

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

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

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

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

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

Два вопроса я здесь:

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

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

+0

Посмотрите объект 'Reflect'. – Bergi

ответ

0

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

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

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

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

Это будет игнорировать config, если существует «реальная» реализация, но продолжайте использовать устаревшее поведение, если вы не заменили класс. Если да, то вы можете реализовать 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 
} 
+0

Да, как бы ни было, это невозможно. Был надеется, что наша текущая реализация системы классов не будет смешана, но не удивительно, что мой краевой случай не поддерживается. – Ajaxier

Смежные вопросы