首页 > 解决方案 > 如何使 JavaScript 类实例成为另一个类的实例?

问题描述

我正在尝试使用winston登录我的项目。要创建一个新的记录器,你通常会这样做:

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

但是,我的选项在整个项目中将基本相同,除了一个label选项,它将是执行日志记录的模块的名称。我不想在 100 个文件中复制createLogger代码,而是想创建一个包装类,它提供最常见的选项createLogger,并允许用户为label构造函数提供一个参数。类的实例应该是winston的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
        });
    }
}

标签: javascriptclassconstructorinstancewinston

解决方案


您不能分配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

推荐阅读