【问题标题】:How can I make a JavaScript class instance be instance of another class?如何使 JavaScript 类实例成为另一个类的实例?
【发布时间】:2020-04-28 02:43:58
【问题描述】:

我正在尝试使用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
        });
    }
}

【问题讨论】:

  • 你为什么要在课堂上这样做?似乎是仅导出函数的完美示例。
  • 是的,我不明白课程的用法。只要有类似getLogger = label => winston.createLogger({ ...opts, label });
  • 另外,为了记录,即使在Java中它充满了类,你通常会有一个工厂来返回你的记录器。我没想到,甚至没有看到有人编写自己的自定义 Logger 类来包装记录器工厂。
  • 对,我应该提到我知道简单地导出函数的选项。也许这是最好的路线。这个特殊问题一直是我的好奇心,所以我认为这将是一个很好的提问和尝试实施的机会。
  • @MegaMatt 正如我在答案的第一行中暗示的那样,唯一真正的方法是将每个方法/属性包装在您自己的类中并将其传递给底层实例。它有它的用途,但可能不是你想要的。

标签: javascript class constructor instance winston


【解决方案1】:

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

【讨论】:

  • 我会交换...defaultOptslabel 的位置,所以后者可以覆盖前者。然后,您可以在 defaultOpts 对象中包含一个默认标签。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-19
相关资源
最近更新 更多