2010-11-03 165 views
6

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 }); 

回答

5

正如我在this answer了解到,进入一个jQuery的私有成员的唯一途径插件是修改插件源本身。

5

你在那里有一个经典的closured函数的例子。

a_private_function是一个函数,它是只有可见范围内的“外部”匿名函数。由于关闭,分配给name_of_plugin的匿名功能可以访问外部context,因此可以访问a_private_function

这是一件好事,因为您可以保护和隐藏一些功能和变量。

小故事,绝对没有机会从外部访问一个闭合变量。

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

认为这可能是有用的。