Esto es más cómo iba a aplicar el patrón que está tratando de hacer:
// MySite.Home Extension
window.MySite =
(function ($, root) {
//private variables
var $divref = $("#divReference");
//private function/method
var privateFunction = function(){
alert("Private");
};
root.Home = {};
// Public variable
root.Home.prop = "Click"
//Public function/method
root.Home.Init = function(params){
alert("Init");
private();
$divref.click(function(){
alert(root.Home.prop);
});
};
return root;
})(jQuery, window.MySite || {});
// MySite.Contact Extension
window.MySite =
(function ($, root) {
root.Contact = {};
// More stuff for contact
return root;
})(jQuery, window.MySite || {});
El primer cambio se está dividiendo cada "espacio de nombres" en su propio patrón de módulo, variables, de modo privado suele sangrar de espacio de nombres de espacio de nombres (si tiene la intención de que sean privados para el espacio de nombres, que sería más C# esque). En segundo lugar, en lugar de acceder al window.MySite
, pase el objeto que desea extender (en este caso lo llamo root
). Esto te dará cierta flexibilidad.
Sus métodos privados no eran realmente privados. Para hacer un método privado, solo desea hacer una función var que se vincule en el cierre, pero no se asigne a una propiedad en el objeto visible externamente. Por último, es probable que no desee utilizar $.somegarbage
. Como se menciona en un comentario, está agregando una propiedad al objeto $
, que seguirá estando allí cuando se cierre. Si quisiera algo cercano, simplemente usaría $somegarbage
que a algunas personas parece gustarles, pero cualquier nombre de variable funcionará para variables privadas, siempre que la variable esté vinculada en el ámbito de cierres (no en otro lugar)
Está en el camino correcto ...
Su enfoque para crear variables privadas es incorrecto. Los adjunta al objeto $, que existirá después de que el código haya terminado de ejecutarse. Quieres un cierre para eso. –
@ g.d.d.c Eso sería una buena respuesta. – vhallac