1

非常に小さなコアを保持し、プラグインを介して拡張できるライブラリを開発したいとします。

だから私は基本的に次の規模の何かを思いついた:

(function(window){
     window.SomeLibrary =(function(){
          var api = { 
              init: function(){
                  console.log('hi');
                  privateFunction();
                },
              plugin: function(callback) {
                  callback.call();
                }
            };
          var privateFunction = function() {
            console.log('im a private method');
            };
        return api;
        }());
    })(window);

SomeLibrary.init();
SomeLibrary.plugin(function(){
    console.log('im a plugin');
    privateFunction(); //fails;    
});

プラグインコールバックにSomeLibraryプライベートメソッドとパブリックメソッドを実行させるにはどうすればよいですか?

前もって感謝します。

4

3 に答える 3

1

プライベート関数をオブジェクトに集めて、このオブジェクトを拡張プラグインに渡すことができます。

Lib.extend('pluginName',function(privates){
    //I have access to privateJob via privates.privateJob();
});

次にlibで:

var privateCollection = {                 //your private collecting object
    privateJob : function(){...}          //a private function
}

extend : function(pluginName,callback){ //an extend function that receives callback
    callback(privateCollection);          //execute callback with private collection
} 

しかし、内部関数へのアクセスは悪い考えです。これはあなたのライブラリの内部を破壊します。

于 2012-05-10T09:39:00.273 に答える
0

privateFunctionコールバックのスコープにありません。クロージャを使用することで、で関数を提供せずにプラグインで関数を使用できるようにすることができますが、関数はプライベートapiではありません。

例えば:

(function(window){
 window.SomeLibrary =(function(){
         var privateFunction = function() {
            console.log('im a private method');
        };
         var init = function(){
              console.log('hi');
              privateFunction();
            };
          var plugin = function(){ 
              var pluginScope={
                  privateFunction :privateFunction,
              };
              return function(callback) {
                  callback(pluginScope);
               }
          }();
          var api = { 
              init: init,
              plugin: plugin
          };
    return api;
    }());
})(window);

SomeLibrary.init();
SomeLibrary.plugin(function(scope){
    console.log('im a plugin ');
    scope.privateFunction();;    
});​

http://jsfiddle.net/uXppZ/2/でテストできます

于 2012-05-10T10:30:05.067 に答える
0

できません。それが彼らがプライベートである理由です。スコープ外からはアクセスできません。

これらのメソッドへの参照を公開する場合は、それらの関数をプロパティまたは として扱う必要があります。つまり、これらの関数SomeLibraryは非公開ではなくなります。

または、閉鎖を使用して同様の結果を得ることができます。でも、それもプライベートではないと思います。

于 2012-05-10T09:49:11.030 に答える