从函数

时间:2015-05-11 14:26:08

标签: javascript ecmascript-6 ecmascript-harmony

我正在尝试使用Function.prototype方法探索使用ES6类而不是我们当前如何使用它。目前我们的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. 如何通过config对象参数创建类并分配属性?
  3. 不确定这是可能的。我们不打算保留createClass,我们希望暂时保留它并升级我们的遗留“类”。我想开始使用ES6课程,但不要打破整个应用程序,不管它需要我们完全升级。

1 个答案:

答案 0 :(得分:0)

唯一好的升级途径是将属性哈希重构为适当的类。您可以开始这项工作并在此期间继续使用基于哈希的类,这将减轻一次性完成所有操作的要求。

如果你有一个有限数量的“类”名称:配置对 - 你应该出于可维护性的原因 - 然后你可以将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 }

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
}

并将配置参数传递给类ctor。在这种情况下,您可能希望首先过滤掉函数属性(方法),因为类可能已经实现了它们。类似的东西:

{{1}}