2010-11-03 22 views
6

jQuery plugin utilizzare un modello come questo per nascondere le funzioni private di un plugin:accedere ai membri privati ​​di plugin jQuery

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

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

jQuery poi fa quelle funzioni fn disponibili come questo:

some_callback = function() {}; 

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

Ora 'Preferisco ignorare a_private_function. C'è un modo in cui posso accedervi senza applicare patch al vero codice del plugin?

ho pensato che forse avrei potuto accedere al contesto di esecuzione della funzione privata utilizzando chiamante, ma che non ha funzionato:

some_callback = function() { 
    console.log(some_callback.caller.a_private_function); // -> undefined 
}; 

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

risposta

5

Come ho imparato a this answer, l'unico modo per accedere ai membri privati ​​di una jQuery plugin per modificare la sorgente del plugin stesso.

5

Quello che hai è un classico esempio di una funzione closured.

a_private_function è una funzione che è solo visibile nell'ambito della funzione anonimo "esterna". A causa della chiusura, la funzione anonima assegnata a name_of_plugin ha accesso all'esterno context e quindi allo a_private_function.

Questa è una buona cosa poiché è possibile proteggere e nascondere alcune funzioni e variabili.

Breve storia, c'è assolutamente zero possibilità di accedere a una variabile chiusa dall'esterno.

1

Quando si utilizza la fabbrica di widget UI JQUERY, le funzioni (che sono precedute da _) non sono private, ma funzioni (simulate) protette (prototipo).

Ciò significa che è possibile accedervi finché si estende il prototipo esistente. Per esempio:

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

    } 
}); 

La funzione che avete dimostrato nel primo esempio è, tuttavia, privato - e quindi come le altre risposte suggeriscono non si può accedere a questi dall'esterno.

Tuttavia, se si desidera accedere a variabili protette all'interno di un widget dell'interfaccia utente JQuery, ciò è possibile (come sopra).

Questo potrebbe essere utile.

Problemi correlati