4

私のプロジェクトで Module パターンを使い始めました。私が理解しているように、それは次のようになります。

var obj = (function(foo){
     //Some initialization logic up here.

     //Private methods
     var privateBazz = function(){
         return "I'm known only to this closure!";
     }();

     //Public methods
     return { 
         publicFoo: foo,
         publicBar: function(){
             return foo + privateBazz;
         }
     }
})();

これは紙の上ではかなり良さそうに見えましたが、実際にはかなりうまく機能しているようです。上部の初期化ロジックは直感的で、次にプライベート メソッド、次にパブリックです。

ただし、1 つの問題が発生しました。return ステートメントのスコープ外および obj の関数宣言のスコープ内から publicFoo または publicBar を呼び出すにはどうすればよいですか?

私の現在の解決策は、次のようなことです。

var obj = (function(foo){
     //Private methods declared early for use.
     var privateBazz = function(){
         return "I'm known only to this closure!";
     }();

     var privateBar = function(){
         return foo + privateBazz;
     };

     //Some initialization logic up here.
     var dependentOnBar = privateBar();

     //Public methods
     return { 
         publicFoo: foo,
         publicBar: privateBar
     }
})();

これは機能しますが、突然、プライベート変数の宣言がオブジェクトのプライベート プロパティ宣言の上に配置されます。プライベート関数の宣言を最初に呼び出すコードの近くに保持しようとすると、問題が悪化するため、必要なすべてのプライベート関数を最初に宣言し、後でプロパティを初期化しています。繰り返しますが、これは機能しますが、コードをできるだけ実行ポイントに近づけることに慣れています。そのため、先頭でプライベート関数のブロックを宣言することは、私にとって本当に厄介です。他の誰かがこのように感じていますか、それとも私が JavaScript を克服する必要があるだけなのでしょうか? これが起こっているのを見たときに取るべき措置はありますか?

4

3 に答える 3

1

オブジェクト表記を使用してモジュールを返すのではなく、モジュールを初期化してビルドするだけで、この問題を解決できるようです。これは次のようになります。

var obj = (function(foo){
     var self = {};
     //Some initialization logic up here.

     //Private properties
     var foo = "only accessible within this scope";

     //Private methods
     var privateBazz = function(){
         return "I'm known only to this closure!";
     }();

     //Public Properties
     self.publicFoo = foo;

     //Public Methods
     self.publicBar = function(){
         return foo + privateBazz;
     };

     return self;
})();
于 2012-07-31T04:30:46.207 に答える
1

ここに私の解決策があります:リターンの前にすべてを「プライベート」メソッドとして宣言し、必要なものを公開すると、パブリック内からプライベートを呼び出すことができ、その逆も可能です(最初のサンプルでは、​​プライベートはできませんその時点では宣言されていないため、公衆に電話してください)

var obj = (function() {
    // All functions now have direct access to each other
    var privateFunc = function() {
        return "private "+publicFunc1();
    };

    var publicFunc1 = function() {
        return "public 1 ";
    };

    var publicFunc2 = function() {
        return "public 2 "+publicFunc1();
    };


    var publicFunc3 = function() {
        return "public 3 "+privateFunc();
    };

    // Return the object that is assigned to Module
    return {
        publicFunc1: publicFunc1,
        publicFunc3: publicFunc3,
        publicFunc2: publicFunc2
    };
}());

alert(obj.publicFunc3());
于 2012-07-31T06:41:37.900 に答える
0

CommonJS Modulesをエミュレートすると、プロパティをexportsオブジェクトに割り当てたり、修飾名または非修飾名を介して IIFE スコープ内の他の場所からアクセスしたりできます。

(function (exports, undefined) {
    var priv1 = 42;
    exports.pubOne = function () {};
    var localAlias = function () {};
    localAlias(42);
    exports.pubTwo = localAlias;
})(window.App);

この例でWindow.Appは、このモジュールの名前空間を持つグローバル オブジェクトである可能性がありますが、空のオブジェクトまたは深くネストされた名前空間を同じように簡単に渡すことができます。

于 2012-07-31T04:15:56.077 に答える