2010-11-03 24 views
6

plugins jQuery utilizan un patrón de esta manera para ocultar eventos privados de un plugin:Acceso miembros privados de plugin de jQuery

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

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

jQuery luego hace las funciones fn disponibles como esto:

some_callback = function() {}; 

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

Ahora Quisiera anular a_private_function. ¿Hay alguna forma de que pueda acceder sin reparar el código del complemento?

pensé que tal vez podría acceder al contexto de ejecución de la función privada mediante el uso de la persona que llama, pero que no funcionó:

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

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

Respuesta

5

Como ya he aprendido en this answer, la única manera de acceder a los miembros privados de una jQuery el complemento debe modificar la fuente del complemento en sí.

5

Lo que tiene allí es un ejemplo clásico de una función closured.

a_private_function es una función que es sólo visible dentro del alcance de la función anónima "externa". Debido al cierre, la función anónima asignada a name_of_plugin tiene acceso al context externo y por lo tanto al a_private_function.

Esto es bueno ya que puede proteger y ocultar algunas de las funciones y variables.

Cuenta breve, no hay absolutamente ninguna posibilidad de acceder a una variable cerrada desde el exterior.

1

Al utilizar la fábrica de widgets JQUERY UI, las funciones (que tienen el prefijo _) no son privadas, sino funciones (prototipo) protegidas (simuladas).

Esto significa que puede acceder a ellos siempre y cuando extienda el prototipo existente. Por ejemplo:

$.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 función que ha demostrado en su primer ejemplo es, sin embargo, privado - y por lo tanto como las otras respuestas sugieren que no se puede acceder a ellos desde el exterior.

Sin embargo, si desea acceder a las variables protegidas dentro de un widget JQuery UI, entonces esto es posible (como se indicó anteriormente).

Pensé que esto podría ser útil.

Cuestiones relacionadas