开发者

Access private members of jQuery plugin

jQuery plugins use a pattern like this to hide private functions of a plugin:

(function ($) {
    var a_private_function = function (opts) {
        opts.onStart();
    }

    $.fn.name_of_plugin = function (options) {
        a_private_function(opts);
    }
})(jQuery);

jQuery then makes those fn functions available like this:

some_callback = function() {};

jQuery('selector').name_of_plugin( { onStart: some_callback } );

Now I'd like to override a_private_function. Is there any way I can access it without patching the actual plugin code?

I thought maybe I could access the execution context of the private function by using caller but that did not work:

开发者_如何学Gosome_callback = function() {
    console.log(some_callback.caller.a_private_function); // -> undefined
};

jQuery('selector').name_of_plugin( { onStart: some_callback } );


As I learned in this answer, the only way to access the private members of a jQuery plugin are to modify the plugin source itself.


What you have there is a classical example of a closured function.

a_private_function is a function which is only visible within the scope from the "outer" anonymous function. Because of closure, the anonymous function assigned to name_of_plugin has access to the outer context and therefore a_private_function.

This is a good thing since you can protect and hide some of functions and variables.

Short story, there is absolutly zero chance to access a closured variable from the outside.


When using the JQUERY UI widget factory, the functions (which are prefixed with _) are not private, but instead (simulated) protected (prototype) functions.

This means you can access them as long as you extend the existing prototype. For example:

$.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

     }
});

The function you have demonstrated in your first example is, however, private - and therefore as the other answers suggest you cannot access these from the outside.

However, if you want to access protected variables inside a JQuery UI widget then this is possible (as above).

Thought this might be useful.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜