Javascript 在外部函数中存储super()?

Javascript 在外部函数中存储super()?,javascript,oop,Javascript,Oop,我目前正在制作一个系统,其中一个(ES6)类扩展了另一个。它接收一个参数对象,其中一些参数需要提供给super()调用,因为它们在基类中是必需的,其他参数稍后在构造函数中应用。问题是,因为这个系统将在许多类中使用,所以我想通过将逻辑放入函数中来自动化这个过程。但是,似乎我不能将super()放在任何非类的内容中 我目前的情况是这样的: class X extends Y { constructor(args) { applySuper(args, required_arg

我目前正在制作一个系统,其中一个(ES6)类扩展了另一个。它接收一个参数对象,其中一些参数需要提供给
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)创建类似于闭包的类。为什么构造器中有这么复杂的东西?如果您可以发布(所有类的)实际代码,这样我就可以建议适当的模式,这会有所帮助。