2

我正在使用一个预先构建的客户端应用程序,这些应用程序都是用我需要扩展的 Dojo 1.8(AMD 风格)编写的。

我可以访问源代码,但希望尽可能保持不变,而是支持覆盖(这就是应用程序插件框架的工作方式,其他任何东西都是hack)。

我的脚本仅在基本应用程序脚本之后加载。例如,我不能修改 djConfig,也不能在加载基本应用程序模块之前发生任何其他事情。

这是我的问题:我想扩展其中一个基础应用程序类(使用声明创建)并在全局范围内应用我的覆盖——即使在已经需要包含此类的模块(但尚未实例化它)的预加载模块上也是如此。

到目前为止,我发现的最佳解决方案是使用 require() 为包含该类的模块设置别名。但这仅适用于在我可以注册别名之后需要该类的模块。

4

1 回答 1

4

Dojo AMD Loader 文档指出:

一旦模块值被输入到模块命名空间中,它就不会在每次需要时重新计算。在实际层面上,这意味着factory 只被调用一次,并且返回的值被缓存并在使用给定模块的所有代码之间共享。(注意:dojo 加载器包含非标准函数 require.undef,它取消定义模块值。)

这意味着如果您修改模块的原型,更改将传播到整个应用程序,甚至传播到更改之前创建的实例,因为这就是 JavaScript 的工作方式。

要修改通过 创建的类的原型,在构造函数上定义了dojo/_base/declare一个extend()方法:

require(['App'], function(App) {
    App.extend({
        run: function() {
            // override `run` method here         
        }
    });
});

看看它在行动:http: //jsfiddle.net/phusick/HxkFs/

于 2013-11-02T21:39:04.743 回答