一般に、これは要約すると、オブジェクトを「名前空間」にカプセル化することです。この用語はJavaScriptの公式のセマンティクスではなく、基本的なオブジェクトのカプセル化によって実現されるものであるため、ここでは引用符を使用します。
これを行うにはいくつかの方法があり、最終的には個人的な好みになります。
1つのアプローチは、基本的なJSオブジェクトを使用し、その中にすべてを保持することです。オブジェクトの名前はセマンティックであり、オブジェクトに何らかの意味を与える必要がありますが、それ以外の目的は、独自のコードをラップして、グローバル名前空間から除外することです。
var SomeName = {
alpha: 1,
beta: {a: 1, b: 2},
gamma: function(){
SomeName.alpha += 1;
}
}
この場合、SomeNameのみがグローバル名前空間にあります。このアプローチの1つの欠点は、名前空間内のすべてがパブリックであり、「this」を使用する代わりに、オブジェクトを参照するために完全な名前空間を使用する必要があることです。たとえば、SomeName.gammaでは、SomeName.alphaを使用してアルファの内容。
もう1つのアプローチは、名前空間をプロパティを持つ関数にすることです。このアプローチの優れた機能は、クロージャを介して「プライベート」変数を作成できることです。また、完全な名前空間参照なしで、閉じられた関数と変数にアクセスできます。
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);
};
}();
このアプローチのもう1つの利点は、使用するグローバル変数を保護できることです。たとえば、jQueryと、$変数を作成する別のライブラリを使用する場合、次の方法で$を使用するときにjQueryを参照していることを常に保証できます。
var SomeName = (function($){
console.log($('div'));
})(jQuery);