我正在尝试使用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;
}
我没想到它会起作用,但事实并非如此。
我在这里遇到两个问题:
不确定这是可能的。我们不打算保留createClass
,我们希望暂时保留它并升级我们的遗留“类”。我想开始使用ES6课程,但不要打破整个应用程序,不管它需要我们完全升级。
答案 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}}