3

私のjavascriptモジュールには次のコードがありますが、これには関数を外の世界に見えるようにする必要があります。

var mymodule = function() {
    var self = null,
        init = function () { 
            self = this; 
            $('.actionButton').click(function () {
        var worklistId = $(this).data('worklistid'),
            action = $(this).data('action');
        self[action] && self[action](worklistId); //watchout methods marked as not used are used by this invocation
            })
        },
        send = function () {
             // some logic
        },
        finish = function () {
             // some logic
        },
        delete = function () {
             // some logic
        };

    return {
        init: init,
        send: send,
        finish: finish,
        delete: delete
    };
}();

mymodule.init();

したがって、モジュールで返したいのはinit関数だけです。ただし、これを行うと、オブジェクト(自己)には外部に表示されるinit関数しか含まれていないため、関数を呼び出すことができません。

return {
    init: init
};

このような関数を外の世界に表示せずに呼び出すための解決策はありますか?私のワークフローはこの例の3つのアクションよりも大きいため、ifelseステートメントは使用しないでください。依存関係が減るので、モジュールをできるだけ閉じたいと思います。

アップデート

これは提案された解決策の1つで更新されたjsfiddleですが、これは私に別の問題を与えています。http://jsfiddle.net/marcofranssen/bU2Ke/

4

5 に答える 5

0

はい、グローバルオブジェクトに関数を表示せずにこれを行う簡単な(しかしおそらく少し厄介な)方法があります。

var privateFunctions = { deleter: deleter, send: send};

次に、の代わりにself[action]();、実行するだけで、準備privateFunctions[action]();は完了です。

予約キーワードであるため、に変更deleteしたことに注意してください...deleterdelete

于 2012-09-04T11:23:52.303 に答える
0

このようなものが機能します:

var mymodule = function() {
        var self = this;
        init = function () { 

            $('.actionButton').click(function () {
        var worklistId = $(this).data('worklistid'), action = $(this).data('action');
        self[action] && self[action](worklistId); //watchout methods marked as not used are used by this invocation
            })
        }
        self.send = function () {
            console.log('send');
        }
        self.finish = function () {
            console.log('finish');
        }
        self.delete = function (item) {
            console.log('delete');
        };

    return {
        init: init,
    };
}();

mymodule.init();​

これがフィドルです:

http://jsfiddle.net/yngvebn/SRqN3/

self-variableを-functionthisの外側に設定し、、および関数をselfにinitアタッチすることにより、 -function内から構文を使用できます。sendfinishdeleteself[action]init

于 2012-09-04T11:24:05.930 に答える
0
var mymodule = function() {
  var self = {},
     init = function () {  
        $('.actionButton').click(function () {
    var worklistId = $(this).data('worklistid'),
        action = $(this).data('action');
    self[action] && self[action](worklistId); //watchout methods marked as not used are used by this invocation
        })
    };
    self.send = function () {
         // some logic
    };
    self.finish = function () {
         // some logic
    };
    self.delete = function () {
         // some logic
    };
    return{
      init:init
    }
}();

mymodule.init();

これはうまくいくはずです!!

于 2012-09-04T11:40:09.613 に答える
0

initプロパティだけでオブジェクトを返し、モジュールがそれらを使用するように残りを動的に設定した場合でも、実行時にそれらを外部に表示することになります。モジュールをデバッグしたい人は誰でも簡単にそれらにアクセスできます。

実行時に匿名メソッドを作成することもでき、それらは実装とともに表示されます。

于 2012-09-04T11:42:56.267 に答える
0

コード例では、「self」が実際に何であるかはあいまいです。単純に保ち、カプセル化された関数を「プライベート」メソッドとして使用し、それらにアクセスできる「パブリック」(またはCrockfordが呼び出す「特権」)関数を返す必要があります。

これは、プライベート関数と変数を使用してシングルトンを実行するYUIの方法です。パターンの例:

var mymodule = (function() {
    var internal = {
        'send': function() {},
        'finish': function() {},
        'delete': function() {}
    };
    return {
        'init': function(action) {
            // access to internals, f.ex:
            if ( internal.hasOwnProperty(action) ) {
                 internal[action].call(this); // bring the caller context
            }
         }
    };
}());

mymodule.init('send');
于 2012-09-04T12:12:55.970 に答える