javascript - 从函数创建 ES6 类

标签 javascript ecmascript-6 ecmascript-harmony

我正在尝试探索使用 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;
}

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

我这里有两个问题:

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

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

最佳答案

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

如果您的“类”名称:配置对数量有限(出于可维护性的原因,您应该这样做),那么您可以将 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
}

并将配置参数传递到类构造函数中。在这种情况下,您可能需要首先过滤掉函数属性(方法),因为该类可能已经实现了它们。像这样的东西:

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
}

关于javascript - 从函数创建 ES6 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30170302/

相关文章:

javascript - 如何让 onclick 函数更改另一个 onclick 函数的属性?

javascript - 全日历记住所选日期

javascript - console.log 返回特定元素

javascript - 在 ES6 中为类分配多个函数

Node 上的 Javascript map ,使用 EcmaScript

javascript - 在 qooxdoo 应用程序中使用 Promise

javascript - 在 JavaScript 中实现 monad

javascript - 多行 JSON 字符串到多行 Javascript 字符串

javascript - RxJS 中按特定时间量分隔可观察值

javascript - 通过 ES6 import 导入远程文件