首页 > 解决方案 > 有条件地扩展当前类

问题描述

我想要一个 JavaScript 类,它可以有条件地从单独的文件中将其他方法添加到自身中。这个想法是将应用程序的不同关注点分离到更易于管理的独立模块中,这些模块仍然可以与母应用程序类中的方法进行交互。因此,单独文件中的附加方法必须能够引用主类中的方法和变量。请参阅下面的代码示例。

我查看了很多不同的解决方案,但它们都有我想要的缺点。

到目前为止,我拥有的最好的是以下内容:

应用程序.js

const Uploads = require("./Uploads.js");
const config = { hasUploads: true }; // Probably loaded from a file

class App {
    constructor() {
        /* Only include the separate module if the config says so */
        if(config.hasUploads) {
            Object.assign(this, Uploads);
        }
    }

    foo() {
        /* Something */
    }
}

上传.js

module.exports = {
    bar() {
        this.foo();
    }
};

它有效,但我不知道这是否是最好的解决方案;

有没有更好/更清洁/更好的方法来做到这一点?

标签: javascriptnode.jsecmascript-6es6-class

解决方案


与其尝试执行某种疯狂的多重继承,不如尝试拥抱组合?它非常适合解决这类问题。

class App {
    
    constructor(modules) {
      if (modules.uploads) {
        this.uploads = modules.uploads(this);
      }
    }
    
    foo() {
        console.log('foo!');
    }
}

class Uploads {
  constructor(context) {
    this.context = context;
  }
  
  method() {
    this.context.foo();
  }
}

const app = new App({ uploads: (ctx) => new Uploads(ctx) });
app.uploads.method();

您可以对此非常感兴趣,并使用构建器来配置具有特定类型模块的应用程序。

根据您预期的复杂性,您可能需要考虑使用event buses, mediators, 或commands将事物与主机本身分离。


推荐阅读