【问题标题】:Create ES6 class from a function从函数创建 ES6 类
【发布时间】:2015-05-11 14:26:08
【问题描述】:

我正在尝试使用 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. 如何创建类并通过配置对象参数分配属性?

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

【问题讨论】:

  • 查看Reflect 对象。

标签: javascript ecmascript-6 ecmascript-harmony


【解决方案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
}

【讨论】:

  • 是的,有点想没有办法做到这一点。希望不要混入我们当前的类系统实现,但不支持我的边缘案例并不奇怪。
猜你喜欢
  • 1970-01-01
  • 2020-09-01
  • 2017-04-19
  • 1970-01-01
  • 2017-10-11
  • 2015-06-08
  • 2019-01-05
  • 2020-03-06
  • 1970-01-01
相关资源
最近更新 更多