为什么不更刻意地建造它呢?
// this one returns an object used like:
// myModule.myInt; /* 456 */
// myModule.myFunc(); /* 124 */
var myModule = (function () {
var secretData = 123,
publicData = 456,
publicFunc = function () { return privateFunc(secretData); },
privateFunc = function (num) { return num + 1; },
public_interface = {
myInt : publicData,
myFunc : publicFunc
};
return public_interface;
}());
我经历了显式命名返回的公共对象的麻烦,但现在很清楚什么是公共的,什么不是公共的,然而,这些东西中的每一个都可以访问彼此的可变版本,除了一个例外如果你改变myModule.myInt
or publicData
,它们将不再相等。
为了演示我在下面的评论中的意思,使用它们自己的私有数据/方法创建多个实例,我只是添加了一层函数范围:
var myModule = (function () {
var static_int = 789,
makeInstance = function (/* any constructor values */) {
var secretData = 123,
publicData = 456,
publicFunc = function () { return privateFunc(secretData); },
privateFunc = function (num) {
console.log(static_int);
return num + 1;
},
public_interface = {
myInt : publicData,
myFunc : publicFunc
};
return public_interface;
};
return makeInstance;
}());
你现在像这样使用它:
var newModule = myModule(/* instance parameters */);
newModule.myFunc();
...或者
var num = myModule(/* instance parameters */).myFunc();
如果你想节省内存,你可以在静态层中使用静态辅助函数:
var myModule = (function () {
var static_int = 789,
static_addOne = function (num) { return num + 1; },
static_divideBy = function (dividend, divisor) { return dividend/divisor; },
makeInstance = function (/* any constructor values */) {
var secretData = 123,
publicData = 456,
publicFunc = function () { return privateFunc(secretData); },
privateFunc = function (num) {
console.log(static_int);
return num + 1;
},
public_interface = {
myInt : publicData,
myFunc : publicFunc
};
return public_interface;
};
return makeInstance;
}());
现在您拥有只编写一次的“私有”函数(即:节省内存),但任何实例都可以使用这些函数。
这里有一个问题:
由于作用域和闭包的工作方式,静态函数无法访问实例内部的值(内部的函数可以访问静态函数,而不是相反)。
因此,任何静态辅助函数都必须将值作为参数传递给它们,并且如果您要修改数字或字符串,则必须从该函数中返回值。
// inside of a private method, in any instance
var privateString = "Bob",
privateFunc = function () {
var string = static_helper(privateString);
privateString = string;
//...
};