Обычно все сводится к инкапсуляции ваших объектов в «пространство имен». Я использую кавычки, потому что этот термин не является официальной семантикой в JavaScript, а скорее достигается путем инкапсуляции базовых объектов.
Есть несколько способов сделать это, и в конечном итоге все сводится к личным предпочтениям.
Один из подходов состоит в том, чтобы просто использовать базовый объект JS и хранить все в нем. Имя объекта должно быть семантическим и придавать объекту некоторое значение, но в противном случае его цель - просто обернуть свой собственный код и не допускать его в глобальное пространство имен.
var SomeName = {
alpha: 1,
beta: {a: 1, b: 2},
gamma: function(){
SomeName.alpha += 1;
}
}
В этом случае только SomeName находится в глобальном пространстве имен. Единственным недостатком этого подхода является то, что все внутри пространства имен является общедоступным, и вы должны использовать полное пространство имен для ссылки на объект, вместо использования «this» - например, в SomeName.gamma мы должны использовать SomeName.alpha для ссылки на содержимое альфа.
Другой подход - сделать ваше пространство имен функцией со свойствами. Приятной особенностью этого подхода является то, что вы можете создавать закрытые переменные через замыкания. Он также дает вам доступ к закрытым функциям и переменным без полной ссылки на пространство имен.
var SomeName = (function(){
var self = this;
var privateVar = 1;
var privateFunc = function() { };
this.publicVar = 2;
this.publicFunc = function(){
console.log(privateVar);
console.log(this.publicVar); // if called via SomeName.publicFunc
setTimeout(function(){
console.log(self.publicVar);
console.log(privateVar);
}, 1000);
};
}();
Другим преимуществом этого подхода является то, что он позволяет вам защитить глобальные переменные, которые хотите использовать. Например, если вы используете jQuery И другую библиотеку, которая создает переменную $, вы всегда можете убедиться, что ссылаетесь на jQuery при использовании $ таким способом:
var SomeName = (function($){
console.log($('div'));
})(jQuery);