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"});

ご覧のとおり、コンストラクターによって作成されたすべてのインスタンス間でプライベート データを共有できます。本当に必要な場合は、特定の select インスタンス関数とのみ共有されるプライベート データを使用できます。これらの関数はコンストラクターで作成する必要があり、これには再利用の影響がありますが、完全にプライベートなインスタンス データを必要としない関数はプロトタイプに配置できるため、すべてのインスタンスで共有できます。

さらに良いことに、便利なスコープ関数が既にあるので、パブリック関数に実際の名前を付けることで、ツールが役立つようにすることができます。

    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 に答える