Хранить super () во внешней функции? - PullRequest
0 голосов
/ 17 мая 2018

В настоящее время я делаю систему, в которой (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... 
}

Есть идеи?

1 Ответ

0 голосов
/ 17 мая 2018

Я бы сделал это с двумя различными функциями:

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() в функцию стрелки и передать его в качестве обратного вызова:

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 {}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...