2012-05-10 2 views
1

매우 작은 코어를 유지하고 플러그인을 통해 확장 될 수있는 라이브러리를 개발하고 싶습니다.플러그인을 통해 javascript 라이브러리를 확장하는 방법은 무엇입니까?

(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 민간 및 공공 방법을 수행 할 수 있습니다 :

그래서 나는 기본적으로 규모에 뭔가 함께했다?

미리 감사드립니다.

+0

에서 테스트 할 수 있습니까? – David

답변

1

개체에서 개인 기능을 수집하고이 개체를 확장 플러그인에 전달할 수 있습니다. lib 디렉토리에서 다음

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 
} 

하지만 액세스는 나쁜 생각입니다. 이것은 귀하의 도서관 내부를 파괴 할 것입니다.

+0

정말 고맙습니다 :) 플러그인 솔루션을 캡슐화 할 수있는 플러그인도 있습니다. Thanks again again :) –

+0

Lib.pluginName()과 같이 호출 할 수 있도록이 플러그인을 어떻게 등록 하시겠습니까? ?? –

+0

@CarlosBarbosa 당신이 할 수있는 한 가지 방법은 그것들을'Lib' 객체에 첨부하는 것입니다. 그런 다음 jQuery와 마찬가지로 모든 jQuery 객체에는 라이브러리 메소드와 플러그인 메소드가 포함되어있다. jQuery가 확장되는 방법에 대해 살펴 보시기 바랍니다. – Joseph

0

수 없습니다. 그것이 개인 인 이유입니다. 범위 외부에서 액세스 할 수 없습니다.

이러한 메소드에 대한 참조가 노출되어있는 경우 해당 함수를 속성 또는 SomeLibrary으로 처리해야합니다. 즉, 해당 함수는 더 이상 private이 아닙니다.

closure을 사용하거나 유사한 결과를 얻을 수 있습니다. 하지만 개인 중 하나라고 생각하지 않습니다.

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/

관련 문제