可能的解决方案
这是我刚刚想出的一个有趣的解决方案。这几乎是不言自明的,我评论了代码。希望它能达到目的。
var p1 = (function (self) {
// private stuff -
var hiddenInfo1 = "PlugIn 1's Secret Info";
var hiddenMethod1 = function () {
alert(hiddenInfo1);
}
// public stuff
self.exposedMethod = function () {
alert("PlugIn 1's Public Info");
}
self.getPrivateAccess = function () {
return {
seal: function () { delete self.getPrivateAccess },
// - list of shared private stuffs
hiddenMethod1: hiddenMethod1,
}
}
return self;
})(p1 || {});
稍后您创建一个主/组合
var master = (function (self, p1) {
// get p1's private stuffs.
var p1sPrivs = p1.getPrivateAccess();
// now seal p1 so that no one else can request it.
p1sPrivs.seal();
// just to make sure, uncomment this line and get a runtime error. ;)
// p1.getPrivateAccess();
// let's define a function for the masses....
self.shoutAll = function () {
p1.exposedMethod();
p1sPrivs.hiddenMethod1();
alert("Master's Public Method");
}
return self;
})(master || {}, p1);
// now use it.
master.shoutAll();
这个想法来自位于http://www.adequatelygood.com/JavaScript-Module-Pattern-In-Depth.html的这篇很棒的文章。尤其是进入称为Cross-File Private State
.
将模块拆分为多个文件的一个严重限制是每个文件都维护自己的私有状态,并且无法访问其他文件的私有状态。这可以修复。这是一个松散增强模块的示例,它将在所有增强中保持私有状态:
var MODULE = (function (my) {
var _private = my._private = my._private || {},
_seal = my._seal = my._seal || function () {
delete my._private;
delete my._seal;
delete my._unseal;
},
_unseal = my._unseal = my._unseal || function () {
my._private = _private;
my._seal = _seal;
my._unseal = _unseal;
};
// permanent access to _private, _seal, and _unseal
return my;
}(MODULE || {}));
任何文件都可以在其局部变量 _private 上设置属性,并且它将立即可供其他文件使用。一旦这个模块完全加载,应用程序应该调用 MODULE._seal(),这将阻止外部访问内部 _private。如果要再次扩充此模块,则在应用程序的生命周期中,任何文件中的内部方法之一都可以在加载新文件之前调用 _unseal() ,并在执行后再次调用 _seal() 。