3

我一直在编写一个应用程序,并且在将不同的功能部分分解为所谓的“模块”模式中取得了很多成功,在这种模式中,您拥有一个具有公共和私有成员的自执行单例。

var WidgetModule = (function($, options) {

    // Private variable
    var someVar;

    // Private functions
    function somePrivateFunction() {

    }

    // Define the public members
    var self = {
        init: function() {

        },
        someFunction: function() {

        }
    };

    return self;

})(jQuery, options);

我现在遇到了一个案例,我有几个模块,我希望能够创建多个实例。

我知道这种模式是基于单例的,但我想知道是否有一种轻松的方式来修改这种模式以支持创建它们的实例?

4

2 回答 2

8

当我需要多个对象的通用功能时,这是我通常使用的模式(根据您提供的代码进行了调整):

var Widget = (function($) {
    var pubs = Widget.prototype;

    // Private variable -- global to all instances
    var someVar;

    // The constructor    
    function Widget(options) {
        var privateInstanceVar;

        this.privateInstanceFunc = function() {
            return privateInstanceVar;
        };
    }

    // Private functions -- global to all instances
    function somePrivateFunction() {

    }

    // Define the public members
    pubs.init = function() {

    };

    pubs.someFunction = function() {

    };

    return Widget;

})(jQuery);

用法:

var w = new Widget({someOption: "here"});

如您所见,您可以在构造函数创建的所有实例之间共享私有数据,如果您真的想要,您可以拥有仅与某些选择实例函数共享的私有数据。这些函数必须在构造函数中创建,这具有重用意义,而不需要真正私有实例数据的函数可以在原型上,因此由所有实例共享。

更好的是,由于您已经有了一个方便的范围函数,您可以通过为您的公共函数提供实际名称来帮助您的工具:

    pubs.init = Widget_init;
    function Widget_init() {

    }

我实际上并没有实际编写上面的代码,因为我定义了一个帮助器工厂,使它更简洁(并且更容易进行功能的专门化,比如从Car继承的功能Vehicle);详情在这里

于 2011-05-16T21:21:48.980 回答
0

那这个呢:

function WidgetModule(options){
    //var $ = jQuery;
    // Private variable
    var someVar;

    // Private functions
    function somePrivateFunction() {

    }

    // Define the public members
    var self = {
        init: function() {
          console.log(options.id);
        },
        someFunction: function() {

        }
    };

    return self;
}

var w1 = WidgetModule({id:1}),
    w2 = WidgetModule({id:2});

w1.init(); // --> 1
w2.init(); // --> 2
于 2011-05-16T21:20:30.000 回答