Javascript 访问jQuery插件的私有成员
jQuery插件使用如下模式隐藏插件的私有函数:Javascript 访问jQuery插件的私有成员,javascript,jquery,Javascript,Jquery,jQuery插件使用如下模式隐藏插件的私有函数: (function ($) { var a_private_function = function (opts) { opts.onStart(); } $.fn.name_of_plugin = function (options) { a_private_function(opts); } })(jQuery); jQuery然后使这些fn函数如下所示: some_callb
(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 } );
现在我想重写一个私有函数
。有没有什么方法可以在不修补实际插件代码的情况下访问它
我想也许我可以通过使用调用者访问私有函数的执行上下文,但这不起作用:
some_callback = function() {
console.log(some_callback.caller.a_private_function); // -> undefined
};
jQuery('selector').name_of_plugin( { onStart: some_callback } );
正如我在中了解到的,访问jQuery插件私有成员的唯一方法是修改插件源代码本身。这里有一个经典的
closured
函数示例
a_private_函数
是仅在“外部”匿名函数的作用域内可见的函数。由于关闭,分配给插件的name\u的匿名函数可以访问外部上下文
,因此a\u私有函数
这是一件好事,因为您可以保护和隐藏一些函数和变量
简而言之,从外部访问封闭变量的机会绝对为零。使用JQUERY UI小部件工厂时,函数(前缀为u)不是私有的,而是(模拟的)受保护的(原型)函数
这意味着只要扩展现有原型,就可以访问它们。例如:
$.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
}
});
但是,您在第一个示例中演示的功能是私有的,因此正如其他答案所示,您无法从外部访问这些功能
但是,如果您希望访问jQueryUI小部件中的受保护变量,那么这是可能的(如上所述)
我想这可能有用