Как я могу сделать экземпляр класса JavaScript экземпляром другого класса? - PullRequest
1 голос
/ 10 января 2020

Я пытаюсь использовать winston для входа в мой проект. Чтобы создать новый регистратор, вы обычно делаете:

import winston from 'winston';
const logger = winston.createLogger({ ...opts });

Тем не менее, мои параметры будут практически одинаковыми во всем проекте, за исключением параметра label, который будет именем модуля, выполняющего ведение журнала. Вместо того, чтобы дублировать код createLogger в 100 файлах, я хотел бы создать класс-оболочку, который предоставляет наиболее распространенные параметры для createLogger и позволяет пользователю предоставить один параметр для label конструктору. Экземпляр класса должен быть экземпляром класса Logger Уинстона, который является возвращаемым значением createLogger.

Итак, подведя итог, я хотел бы иметь возможность сделать это:

import OurLogger from './our-logger';
const fooModuleLogger = new OurLogger('foo'); // full winston Logger instance

Мой лучший снимок сейчас на OurLogger.js будет выглядеть примерно так:

import winston from 'winston';
export default class {
    constructor(label = 'defaultLabel') {
        const defaultOpts = { ... }

        // I know this part is wrong. But what's the right way?
        this = winston.createLogger({
            label,
            ...defaultOpts
        });
    }
}

1 Ответ

2 голосов
/ 10 января 2020

Вы не можете назначить this, и без создания методов-обёрток для каждого бита функциональности класс здесь не кажется нужным.

Почему бы просто не экспортировать функцию и не использовать ее?

export default function OurLogger(label){
    const defaultOpts = { ... }
    return winston.createLogger({
        label,
        ...defaultOpts
    });
}

А потом просто

import OurLogger from './our-logger';
const fooModuleLogger = OurLogger('foo'); // full winston Logger instance
...