Javascript 在外部函数中存储super()?
我目前正在制作一个系统,其中一个(ES6)类扩展了另一个。它接收一个参数对象,其中一些参数需要提供给Javascript 在外部函数中存储super()?,javascript,oop,Javascript,Oop,我目前正在制作一个系统,其中一个(ES6)类扩展了另一个。它接收一个参数对象,其中一些参数需要提供给super()调用,因为它们在基类中是必需的,其他参数稍后在构造函数中应用。问题是,因为这个系统将在许多类中使用,所以我想通过将逻辑放入函数中来自动化这个过程。但是,似乎我不能将super()放在任何非类的内容中 我目前的情况是这样的: class X extends Y { constructor(args) { applySuper(args, required_arg
super()
调用,因为它们在基类中是必需的,其他参数稍后在构造函数中应用。问题是,因为这个系统将在许多类中使用,所以我想通过将逻辑放入函数中来自动化这个过程。但是,似乎我不能将super()
放在任何非类的内容中
我目前的情况是这样的:
class X extends Y {
constructor(args) {
applySuper(args, required_args);
// args is an object
// required_args is a subset of args
}
}
function applySuper(args, required_args) {
// Uncaught SyntaxError: 'super' keyword unexpected here
super(required_args.arg1, required_args.arg2, ...);
// Find some way to separate the optional args and do something else with those...
}
有什么想法吗?我会用两种不同的功能来实现:
class X extends Y {
constructor(args) {
super(...baseArgs(args));
otherArgs(this, args);
}
}
function baseArgs(required_args) {
return [required_args.arg1, required_args.arg2, …];
}
function otherArgs(instance, args) {
// Find some way to separate the optional args and do something else with those...
}
也就是说,您可以将super()
调用放入一个arrow函数中,并将其作为回调传递:
class X extends Y {
constructor(args) {
applyArgs(args, (...baseArgs) => {
super(...baseArgs);
return this;
});
}
}
function applyArgs(args, init) {
const instance = init(args.arg1, args.arg2, …);
// Find some way to separate the optional args and do something else with those...
}
但实际上,如果多个类应该共享相同的行为,为什么不给它们相同的超类呢
class Z extends Y {
constructor(args) {
super(args.arg1, args.arg2, …);
// Find some way to separate the optional args and do something else with those...
}
}
class X extends Z {}
required\u args
来自哪里?在调用applySuper
之前,它是从args
中提取的吗?这是最不重要的部分,我只想给出一些上下文和applySuper
函数中的实现可能会有一些变化。但是让我们假设required\u args
是一个对象,它具有在args
中找到的键值对子集。比如,args={1:1,2:2,3:3}
和required_args={1:1,3:3}
。applySuper()
函数应该在调用它的构造函数上调用super()
(在本例中,super(1,3)
,并对其余参数执行其他操作(在本例中,two:2
).ES6类只是常规JS对象,因此您可以将超级逻辑放在常规函数中,并使用调用应用等。我的意图是将所有逻辑放在外部函数中。因此,在使用超级()时
然后函数调用解决了这个问题,我宁愿只调用一个函数,因为这样会出现多次。让类相互继承的问题是,我的类已经从第三方库的类继承。@Rafael替代解决方案是a)使用静态(可继承)方法而不是构造函数b)创建类似于闭包的类。为什么构造器中有这么复杂的东西?如果您可以发布(所有类的)实际代码,这样我就可以建议适当的模式,这会有所帮助。