通常,这归结为将您的对象封装到“命名空间”中。我在那里使用引号是因为该术语不是 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);