3

これは、私が何年にもわたって使用し、微調整していることに気付いたjsパターンです。

問題は、私はいくつかの実験の後でそれに陥りました、そして私はこのタイプのパターンが名前を持っているかどうか知りたいです。私は多くのデザインパターンを閲覧しましたが、類似したものは見つかりませんでした(または、特にモジュラータイプのパターンの場合は単純です)。

var FOO = (function ($) {
    var privateFuncA = function() {
        ...
    },        
    privateFuncB = function() {
        ...
    },
    self = {
        init: function() {
            privateFuncA(); // Call a private func
            self.publicFunc(); // Call a public func
        },
        publicFunc: function() {
            ...
        }
    };
    return self;
}(jQuery));

$(function () {
    // Initialise FOO
    FOO.init();
});

アイデアは、すべての名前空間を維持し、疑似パブリック/プライベート機能を可能にすることです。

モジュール化する必要がある場合は、ベースFOOオブジェクトを拡張します。

// Extend FOO object
FOO.Bar = (function ($) {
    var privateFunc = function() {
        ...
    },
    self = {
        publicFunc: function() {
            ...
        }
    };
    return self;
}(jQuery));

外部から拡張オブジェクトでpublicFuncを呼び出したい場合は、次のことができます。

FOO.Bar.publicFunc()

このタイプのパターンに名前があるかどうか、またはそのようなデザインに既知の問題があるかどうかを誰かが知っていますか?

4

1 に答える 1

3

もちろん。これは、ChristianHielmannの「RevealingModule」パターンの単なる拡張であり、それ自体がDouglasCrockfordのModuleパターンの拡張でした。

ここでのSOに関する私の例の多くでは、publicprivate、またはprivate-staticが何であるかをより明確にするために、に置き換えることselfを除いて、非常によく似たものを使用します。public_interface

var built_module = (function () {

    var private_data = "",
        private_method = function () { /* ... */ },

        public_interface = {
            public_method : function () { /* ... */ },
            public_data
        };

    return public_interface;

}());

コンストラクターとして:

var built_constructor = (function (env_params) {

    var static_data = "",
        static_method = function () { /* ... */ },

        public_constructor = function (params) {
            var private_data = "",
                private_method = function (params) { /* ... */ },

                public_interface = {
                    public_method : function () { /* ... */ },
                    public_data
                };

            return public_interface;
        };

    return public_constructor;
}(envArgs));


var myInstance = built_constructor(myArgs);

「静的」データ/プロパティは外部クロージャにあるため、内部クロージャ内のすべての変数/関数はそれらにアクセスできますが、「静的」メソッドは、渡さずにインスタンスメソッド/データにアクセスできません。関数への引数。

ここから任意の方法で拡張できます。戻り値を削除し、代わりにpublic_interfaceオブジェクトのプロパティとして、またはwindowデフォルトで(名前空間の場合)を割り当てます。

于 2012-12-02T17:39:54.380 に答える