代码之家  ›  专栏  ›  技术社区  ›  AndreKR

访问jQuery插件的私有成员

  •  6
  • AndreKR  · 技术社区  · 14 年前

    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 } );
    
    3 回复  |  直到 14 年前
        1
  •  5
  •   Community CDub    8 年前

    我从中学到 this answer

        2
  •  5
  •   jAndy    14 年前

    closured 功能。

    a_private_function 只有 在“外部”匿名函数的作用域内可见。由于闭包,匿名函数被分配给 name_of_plugin 能够接触到外部 context 私人职能

    这是一件好事,因为你可以保护和隐藏一些函数和变量。

    简而言之,从外部访问closured变量的机会绝对为零。

        3
  •  1
  •   CalM    13 年前

    当使用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
    
         }
    });
    

    然而,您在第一个示例中演示的功能是私有的,因此正如其他答案所示,您不能从外部访问这些功能。

    但是,如果您想访问JQuery UI小部件中的受保护变量,那么这是可能的(如上所述)。

    我想这可能有用。