2012-09-21 69 views
0

我正在开发一个JavaScript库,并希望将不同模块中的Javascript对象的可选方法组存储起来。AMD单点JavaScript扩展方法对象

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

在第三个模块不在库,ModuleC,我想以下几点:

  • 如果我只导入ModuleA和实例ClassA的,我知道我有机会获得上使用'InstanceA所有ModuleA方法InstanceA.MethodA(...)”。 (其他方法也可以在InstanceA上定义)

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

我已经考虑了一些解决方案,但我不确定是否有一个首选的方法来实现这一点。以下是我考虑的内容:

ModuleB更改ClassA ModuleB导入ModuleA并更改ClassA的工厂。这些变化会保证持续吗? AMD是否保证在一个环境中导入相同的模块始终返回相同的对象?

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

如果您遇到过类似的情况以及您的解决方案,请让我知道。

+0

顺便说一句,这两种方法的工作。但是,据我所知,第一种方法依赖于非标准行为。我测试过的模块加载实现保留了加载模块的缓存版本。但是,AMD规范似乎没有任何关于模块定义副作用的说法。如果这是错误的,请纠正我。 –

+1

Dojo AMD Loader [文档](http://livedocs.dojotoolkit.org/loader/amd):'define'有两个额外的重要特征,可能不会立即显现出来: – phusick

+0

1.模块创建是惰性的并且是异步的,当调用'define'时不会立即发生。这意味着工厂没有执行,并且模块的任何依赖关系都不会被解析,除非某些运行代码实际需要该模块。 – phusick

回答

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(); 
} 
+1

我没有真正考虑过这种方法,但它看起来不错,并使扩展更加明确。另外需要注意的是,我在ModuleB(扩展模块)中添加了检查,以确保不会覆盖现有属性。结合phusick描述的模块加载逻辑,这个工作非常好。 –