jQuery插件使用这样的模式来隐藏插件的私有函数:
(function ($) {
var a_private_function = function (opts) {
opts.onStart();
}
$.fn.name_of_plugin = function (options) {
a_private_function(opts);
}
})(jQuery);
jQuery然后使这些fn函数可用:
some_callback = function() {};
jQuery('selector').name_of_plugin( { onStart: some_callback } );
现在我要覆盖a_private_function
。有没有办法在不修补实际插件代码的情况下访问它?
我想也许我可以通过使用调用者来访问私有函数的执行上下文但是这不起作用:
some_callback = function() {
console.log(some_callback.caller.a_private_function); // -> undefined
};
jQuery('selector').name_of_plugin( { onStart: some_callback } );
答案 0 :(得分:5)
正如我在this answer中所了解到的,访问jQuery插件的私有成员的唯一方法是修改插件源本身。
答案 1 :(得分:5)
你所拥有的是一个closured
函数的经典例子。
a_private_function
是一个在“外部”匿名函数范围内仅可见的函数。由于封闭,分配给name_of_plugin
的匿名函数可以访问外部context
,因此可以访问a_private_function
。
这是一件好事,因为你可以保护和隐藏一些功能和变量。
简短的说法,绝对没有机会从外部访问一个关闭的变量。
答案 2 :(得分:1)
使用JQUERY UI小部件工厂时,函数(以_为前缀)不是私有的,而是(模拟的)受保护(原型)函数。
这意味着只要扩展现有原型,就可以访问它们。例如:
$.extend( $.ui.accordion.prototype, {
open: function( index ) {
//now you can access any protected function
var toOpen = self._findActive( index );
toOpen.next().show();
},
_completed: function ( cancel ) {
//You can even overwrite an existing function
}
});
您在第一个示例中演示的功能是私有的 - 因此其他答案表明您无法从外部访问这些功能。
但是,如果您想在JQuery UI小部件中访问受保护的变量,那么这是可能的(如上所述)。
认为这可能有用。