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();
});

然后在库中:

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

你不能。这就是为什么它们是私有的。无法从范围外访问它们。

如果您公开了对这些方法的一些引用,则需要将这些函数视为属性或SomeLibrary,这意味着它们不再是私有的。

或者您可以使用闭包来实现类似的结果。但我也不认为它是私人的。

于 2012-05-10T09:49:11.030 回答
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 回答