Это больше, как я бы реализовал шаблон, который вы пытаетесь сделать:
// 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 || {} );
Первое изменение - это разбиение каждого "пространства имен" на собственный шаблон модуля, поэтому частные переменные не будут сливаться из пространства имен впространство имен (если вы намереваетесь, чтобы они были частными по отношению к пространству имен, что было бы более C # esque).Во-вторых, вместо доступа к window.MySite
, передайте объект, который вы хотите расширить (в данном случае я называю его root
).Это даст вам некоторую гибкость.
Ваши приватные методы не были действительно приватными.Чтобы создать приватный метод, вы просто хотите создать функцию var, которую он связал в замыкании, но не назначил свойству внешне видимого объекта.Наконец, вы, вероятно, не хотите использовать $.somegarbage
.Как упоминалось в комментарии, вы добавляете свойство к объекту $
, которое все еще будет там, когда будет выполнено закрытие.Если бы вы хотели что-то близкое, я бы просто использовал $somegarbage
, что некоторые люди, кажется, хотели бы сделать, но любое имя переменной будет работать для частных переменных, до тех пор, пока переменная связана в области замыканий (не где-то еще)1013 *
Вы на правильном пути ...