Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 访问jQuery插件的私有成员_Javascript_Jquery - Fatal编程技术网

Javascript 访问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

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 } );
现在我想重写
一个私有函数
。有没有什么方法可以在不修补实际插件代码的情况下访问它

我想也许我可以通过使用调用者访问私有函数的执行上下文,但这不起作用:

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小部件中的受保护变量,那么这是可能的(如上所述)

我想这可能有用