有条件地扩展当前课程

问题描述

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

我看过很多不同的解决方案,但是它们都不利于我想要的东西。

  • 我可以做new Uploads(),但是找不到Uploads.js中的方法引用主App类中的方法的方式
  • 我可以使用extends,但这不允许使用条件扩展名AFAIK
  • I could just define new methods into the prototype itself,但这意味着外部文件将需要“知道”将要使用的类,这并不能使其广泛地重复使用。

到目前为止,我拥有的最好的是:

app.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 */
    }
}

Uploads.js

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

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

  • 没有构造函数,因此如果Uploads.js需要进行一些设置,则app.js需要包含这样做的逻辑(或至少知道调用某些唯一命名的仿构造函数方法),似乎并不理想。
  • 如果Uploads.js包含与app.js同名的方法或正在加载的任何其他可能的模块,则它们将被覆盖,从而导致意外的行为。
  • Uploads.js是函数的对象,而app.js定义了一个类。为代码的可管理性,理想(尽管我想不一定),它们都应使用相同的语法。

是否有更好/更清洁/更精细的方法?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)