1

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

每个沙箱都必须在中介处注册。因为我也使用 requirejs,所以这是一个小问题,因为我不知道如何共享实例而不是原型:

中介者.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);
});

正如您在当前方法中提到的那样,我在两个不同的中介处注册了沙箱。解决这个问题的一个想法是使用单例模式,但这与架构和 requirejs 建议冲突。

那么我还有什么其他方法可以让沙箱注册到同一个中介者实例?

4

2 回答 2

2

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

ggozad 在这里解释了如何在 RequireJS 中执行单例:将 requireJS 模块用作单例是一种不好的做法吗?

他的代码:

define(function (require) {
    var singleton = function () {
        return {
            ...
        };
    };
    return singleton();
});
于 2012-09-23T09:22:59.210 回答
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版本内置。

于 2014-02-26T13:25:01.157 回答