0

我正在开发一个 javascript 库,并希望在不同模块中的 Javascript 对象上存储可选方法组。

该库有两个模块,我们称它们为 ModuleA 和 ModuleB。ModuleA 导出一个类对象,我们称之为 ClassA,它只有最小的核心功能。ModuleB 定义了一组可选方法,这些方法要设置在 ClassA 的原型上。

在不在库中的第三个模块 ModuleC 中,我想要以下内容:

  • 如果我只导入 ModuleA 并实例化 ClassA,我知道我可以使用“InstanceA.MethodA(...)”访问 InstanceA 上的所有 ModuleA 方法。(其他方法也可以在 InstanceA 上定义)

  • 如果我同时导入 ModuleA 和 ModuleB 并实例化 ClassA,我知道我可以使用“InstanceA.MethodA(...)”和“InstanceA.MethodB(...)”访问 InstanceA 上的所有 ModuleA 方法和 ModuleB 方法。

我考虑了一些解决方案,但不确定是否有首选的方法来实现这一点。这是我考虑过的:

ModuleB 改变 ClassA ModuleB的工厂导入 ModuleA 并改变 ClassA。这些变化能保证持续下去吗?AMD 是否保证跨环境导入相同的模块总是返回相同的对象?

ModuleB 返回改变的 ClassA ModuleB 扩展 ClassA 并返回新的 Object。在这个只有两个模块的例子中,这可能工作得很好,但是如果有多个可选的方法模块呢?

请让我知道您是否遇到过类似的情况以及您的解决方案是什么。

4

1 回答 1

0

这是我的方法:

// Module A - Define ClassA
define(function() {
    function ClassA() {}
    ClassA.prototype.methodA = function() {};
    return ClassA;
});

// Module B - Extend
define(function() {
    return function(ClassToExtend) {
         ClassToExtend.prototype.methodB = function() { };
    };
});

// Module C - Sticking
define(function(require) {

    // Define ClassA
    var ClassA = require("module_a");

    // Extend ClassA with custom methods of ModuleB
    require("module_b")(ClassA);

    // Instanciate extended ClassA
    var InstanceA = new ClassA();
}
于 2012-09-30T04:57:40.243 回答