3

免責事項:私はExtJS 3を使用していますが、名前空間関数の一般的な使用以外では、質問との関連性はあまりないと思います。

次のような非常に長い名前空間で宣言されたシングルトンがあります。

Ext.ns("REALLY.REALLY.LONG.NAMESPACE");

var Singleton = (function() {   
    var foo = {
        bar: "baz"
    }; 

    var privateFunction = function(param){
        // ...
        return foo;
    };

    var single = Ext.extend(Object, {
        constructor: function(config) {
            Ext.apply(this, config);
        },
        otherFunction: privateFunction,     
        publicFunction: function (someObject){
            // do stuff with someObject
        }
    });

    return single;

})();
// Make it a singleton
REALLY.REALLY.LONG.NAMESPACE.Singleton = new Singleton();

REALLY.REALLY.LONG.NAMESPACE.Singleton.otherFunction();やなどの呼び出しを介して他のモジュールで使用しますREALLY.REALLY.LONG.NAMESPACE.Singleton.publicFunction(myObject);。シングルトンのエイリアスを使用してクライアントモジュールを設定することで、これらの呼び出しを交換できるかどうか疑問に思っています。つまりvar singleton = REALLY.REALLY.LONG.NAMESPACE.Singleton;、を呼び出すことができますsingleton.otherFunction();。これがアンチパターンなのか、それとも落とし穴(メモリ?)があるのか​​、この使用法に遭遇する可能性があるのではないかと思います。

StackOverflowに感謝します!

4

2 に答える 2

7

シングルトンのエイリアスを使用してクライアントモジュールを設定することで、これらの呼び出しを交換できるかどうか疑問に思っています

はい、できます。

これがアンチパターンなのか、それとも落とし穴(メモリ?)があるのか​​、この使用法に遭遇する可能性があるのではないかと思います。

いいえ、私が考えることができるものはありません。完全に修飾されたバージョンを呼び出すよりも高速です。

ローカルエイリアスパターン


例:

function somefunc(){
    var singleton = REALLY.REALLY.LONG.NAMESPACE.Singleton;

    singleton.publicFunction();
};

または:

(function somfunc(singleton){

}(REALLY.REALLY.LONG.NAMESPACE.Singleton));

試験結果:

http://jsfiddle.net/jMg9A/

于 2012-06-26T19:30:12.133 に答える
2

元の「オブジェクト」への参照を作成することに問題はありません。多くの場合、コードを整理するために名前空間を作成しますが、もちろん、これは後で参照したくない非常に長い名前空間につながる可能性があるため、その名前空間へのローカル参照を作成することは、次のことができるようにするための優れたアイデアです。さまざまな場所ではなく、1つの場所で変更します。

ここではアリのパターンは実際には見られませんが、代わりに、自分でそれをより単純にし、開発者の観点からはおそらくもう少し管理しやすくする機会があります。

于 2012-06-26T19:56:20.483 に答える