关于Javascript对象的AMD单点扩展方法

时间:2012-09-21 19:44:19

标签: javascript js-amd

我正在开发一个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。在这个例子中,这可能只有两个模块可以正常工作,但是有多个可选的方法模块呢?

如果您遇到类似的情况以及您的解决方案是什么,请告诉我。

1 个答案:

答案 0 :(得分: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();
}