从函数创建 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;
}
我没想到它会起作用,但它没有。
我这里有两个问题:
- 如何使用变量作为 class 名称创建 class?
- 如何创建 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
}
我正在尝试探索使用 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;
}
我没想到它会起作用,但它没有。
我这里有两个问题:
- 如何使用变量作为 class 名称创建 class?
- 如何创建 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
}