通过requirejs共享原型实例而没有单例模式?

时间:2012-09-23 08:27:13

标签: javascript singleton instance requirejs amd

我有一个处理沙箱的中介对象。

每个沙箱都必须在调解员处注册。因为我也使用requirejs这是一个小问题因为我不知道如何分享实例而不是原型:

mediator.js

define([], function() {
    var Mediator = function() {};
    Mediator.prototype.start = function() {};
    Mediator.prototype.stop = function() {};
    Mediator.prototype.register = function() {};
    Mediator.prototype.unregister = function() {};
    return Mediator;
});

sandbox_one.js

define(['mediator'], function(Mediator) {
    var mediator = new Mediator();
    mediator.register('sandboxOne', SandboxObject);
});

sandbox_two.js

define(['mediator'], function(Mediator) {
    var mediator = new Mediator();
    mediator.register('sandboxtwo', SandboxObject);
});

正如您在当前方法中所提到的,我在两个不同的调解器上注册了沙盒。解决这个问题的一个想法是使用单例模式,但这与架构冲突并需要建议。

那么还有什么其他方法可以让沙箱将所有内容注册到Mediator的同一个实例?

2 个答案:

答案 0 :(得分:2)

由于我无法发表评论,我将发布一个答案。

ggozad解释了如何在RequireJS中执行单例操作:Is it a bad practice to use the requireJS module as a singleton?

他的代码:

define(function (require) {
    var singleton = function () {
        return {
            ...
        };
    };
    return singleton();
});

答案 1 :(得分:0)

实际上, RequireJS 你已经收到了单身人士,所以如果你打电话:

require(['mediator'], function(Mediator) {
  ....
});

Mediator将始终是同一个对象。如果它是构造函数,通过调用new Mediator(),您将始终创建一个新实例,但每次都会使用相同的函数

但你不必返回一个函数:

define([], function() {
    return {
        start: function() {},
        stop: function() {},
        register: function() {},
        unregister: function() {}
    };
});

现在你的Mediator将是一个实例,而不是一个函数,你不能将它用作函数。你的例子现在看起来像:

require(['mediator'], function(Mediator) {
  Mediator.register('sandboxOne', SandboxObject);
});

免责声明:我在 Dojo 中使用 RequireJS 版本内置。