2010-11-03 2 views
6

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_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, это возможно (как указано выше).

Думал, что это может быть полезно.

Смежные вопросы