从函数创建 ES6 class

Create ES6 class from a function

我正在尝试探索使用 ES6 classes 而不是我们目前的做法,使用 Function.prototype 方法。目前我们的 API 看起来像:

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

我们遍历对象并将这些属性应用到我们 return 的函数上,基本上是一种比这样做更漂亮的方法,因此它更符合其他编程语言的种类:

function MyClass() {}

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

我们还将 class 缓存到一个对象上,其中名称是键,函数是整个应用程序中使用的值。 class 名称可以命名空间,因此您可以拥有 My.Cls,它将按句点拆分,然后将其缓存到管理器中,但也可以通过 window.My.Cls.[=18= 检索它]

查看 ES6 classes,我不知道如何保留 createClass 功能。会喜欢这样的东西:

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

我没想到它会起作用,但它没有。

我这里有两个问题:

  1. 如何使用变量作为 class 名称创建 class?
  2. 如何创建 class 并通过配置对象参数分配属性?

不确定这是否可行。我们不打算保留 createClass,我们希望暂时保留它并升级我们的遗留 "classes"。我想开始使用 ES6 classes 但不会破坏整个应用程序,无论我们需要多长时间才能完全升级。

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

如果您的 "class" name:config 对数量有限(出于可维护性原因,您应该这样做),那么您可以将 createClass 替换为执行以下操作的实现:

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

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

如果 "real" 实现存在,这将忽略配置,但如果您没有替换 class,则继续使用遗留行为。如果是,您可以更像 createClass 实现:

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

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

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
}