2010-11-03 121 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小部件中的受保護變量,那麼這是可能的(如上所述)。

認爲這可能是有用的。