如何通过插件扩展JavaScript库?

时间:2012-05-10 09:29:14

标签: javascript plugins callback extend

假设我想开发一个可以保留非常小的核心的库,并且可以通过插件进行扩展。

所以我基本上想出了一些规模:

(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私有和公共方法?

提前致谢。

3 个答案:

答案 0 :(得分: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
} 

但访问内部函数是个坏主意。这将破坏你图书馆的内部。

答案 1 :(得分:0)

你做不到。这就是他们私人的原因。无法从范围之外访问它们。

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

或者您可以使用closure来获得类似的结果。但我认为它不是私人

答案 2 :(得分: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/

进行测试