假设我想开发一个可以保留非常小的核心的库,并且可以通过插件进行扩展。
所以我基本上想出了一些规模:
(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 :(得分: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();;
});
进行测试