对于我的Web应用程序,我在JavaScript中创建一个命名空间,如下所示:
var com = {example: {}};
com.example.func1 = function(args) { ... }
com.example.func2 = function(args) { ... }
com.example.func3 = function(args) { ... }
我还想创建“私有”(我知道这在JS中不存在)命名空间变量,但我不确定什么是最好的设计模式。
是不是:
com.example._var1 = null;
或者设计模式是别的吗?
答案 0 :(得分:8)
闭包经常像这样用来模拟私有变量:
var com = {
example: (function() {
var that = {};
// This variable will be captured in the closure and
// inaccessible from outside, but will be accessible
// from all closures defined in this one.
var privateVar1;
that.func1 = function(args) { ... };
that.func2 = function(args) { ... } ;
return that;
})()
};
答案 1 :(得分:8)
道格拉斯·克罗克福德推广所谓的Module Pattern,您可以使用“私人”变量创建对象:
myModule = function () {
//"private" variable:
var myPrivateVar = "I can be accessed only from within myModule."
return {
myPublicProperty: "I'm accessible as myModule.myPublicProperty"
}
};
}(); // the parens here cause the anonymous function to execute and return
但正如你所说Javascript并没有真正拥有私有变量,而且我认为这有点像是一个破坏其他东西的混乱。例如,尝试从该类继承。
答案 2 :(得分:0)
7年后,这可能会来得很晚,但是我认为这可能对遇到类似问题的其他程序员很有用。
几天前,我想到了以下功能:
{
let id = 0; // declaring with let, so that id is not available from outside of this scope
var getId = function () { // declaring its accessor method as var so it is actually available from outside this scope
id++;
console.log('Returning ID: ', id);
return id;
}
}
仅当您位于全局范围内并且要声明一个变量,该变量只能将id的值设置为1并返回其值时,才能从任何地方访问该变量。