【问题标题】:Share prototype instance through requirejs without singelton pattern?通过没有单例模式的requirejs共享原型实例?
【发布时间】:2012-09-23 08:27:12
【问题描述】:

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

每个沙盒都必须在中介处注册。因为我也使用 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);
});

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

那么我还有什么其他方法可以让沙盒注册到同一个 Mediator 实例?

【问题讨论】:

  • 你能再解释一下吗?如果你在任何地方都使用同一个实例,那么无论如何你都会有一个单例,不管你怎么称呼它?

标签: javascript singleton instance requirejs amd


【解决方案1】:

由于我无法发布 cmets,我将发布答案。

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

他的代码:

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

【讨论】:

  • 没有理由拥有 singleton 函数 - 只需返回对象字面量
  • @ZenMaster:你已经有了define的匿名函数……
  • @Bergi 不。我的意思是匿名函数内部的范围。单例的默认值(起始值)。
【解决方案2】:

实际上,使用 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 版本内置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-07
    • 2015-03-18
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 2012-10-31
    相关资源
    最近更新 更多