我正在尝试探索使用 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;
}
我没想到它会起作用,但它没有起作用。
我这里有两个问题:
- 如何使用变量作为类名来创建类?
- 如何创建一个类并通过配置对象参数分配属性?
不确定这是否可行。我们不打算保留 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/