我之前遇到过JavaScript模块化下的数据隐藏问题。请参阅以下链接:
Module pattern- How to split the code for one module into different js files?
JavaScript - extract out function while keeping it private
要说明问题,请参阅下面的示例。我的目标是将我的长js文件拆分为2个文件,但有些函数需要访问一些私有变量:
first.js:
(function(context) {
var parentPrivate = 'parentPrivate';
})(window.myGlobalNamespace);
second.js:
(function(context) {
this.childFunction = console.log('trying to access parent private field: ' + parentPriavte);
}(window.myGlobalNamespace.subNamspace);
现在这不起作用,因为孩子无法访问父母。一种解决方案是使parentPrivate
公开可见,但在我的情况下这是不可接受的。
引用@Louis,他回答了前面的一个问题:
“我们不能拥有儿童可以访问的字段,但不能访问外部 公众(即受保护的)。有没有办法实现这个目标?“
如果你想要模块化(即你想要对孩子进行编码) 与父母分开),我不相信这是可能的 JavaScript的。孩子和父母可以参与其中 相同的关闭,但这不是模块化的。这是真的 或没有RequireJS。
问题是父和子不在同一个闭包内。因此,我在想,创建一个将文件放入同一个闭包中的库是否有意义?
类似的东西:
concatenator.putIntoOneClosure(["public/js/first.js", "public/js/second.js"]);
当然我们可以接受更多参数来指定命名空间等。请注意,它与RequireJS的功能不同。 RequireJS实现了模块化,而这个连接器专注于模块化条件下的数据隐藏。
上述任何一个都有意义吗?还是我错过了一些重点?欢迎任何想法。
答案 0 :(得分:0)
如果您需要两个单独的文件中提供的内容,那么您就无法获得真正的隐私......但是,类似的内容可能对您有用:
<强> first.js:强>
(function(context) {
var sharedProperties = {
sharedProp1: "This is shared"
};
function alertSharedProp1() {
alert (sharedProperties.sharedProp1)
}
window[context] = {
sharedProperties: sharedProperties,
alertSharedProp1: alertSharedProp1
};
})("myGlobalNamespace");
<强> second.js:强>
(function(parent, context) {
// CHANGED: `this` doesn't do what you think it does here.
var childFunction = function() {
console.log('trying to access parent private field: ' + window.myGlobalNamespace.sharedProperties.sharedProp1);
};
window[parent][context] = {
childFunction: childFunction
};
}("myGlobalNamespace", "subNamspace"));
window.myGlobalNamespace.subNamspace.childFunction();
根据评论修改详细答案
我所做的是设置一个如下所示的源文件:
<强> master.js 强>
(function() {
##include: file1.js##
##include: file2.js##
}());
然后我写了一个脚本(在我的情况下是在windows脚本中),在master.js
中读取,然后逐行阅读,寻找##include: filename.js##
行。当它找到这样一行时,它会在包含文件中读取并将其转出。
我的特殊需求是特别的,因为我正在编写一个浏览器插件,需要在三个不同的浏览器中工作,并且必须单独包装,但为了我自己的理智,我希望使用单独的文件。