一个JavaScript连接器,帮助模块化下的数据隐藏?

一个JavaScript连接器,帮助模块化下的数据隐藏?,javascript,requirejs,module-pattern,modularization,data-hiding,Javascript,Requirejs,Module Pattern,Modularization,Data Hiding,我以前遇到过JavaScript模块化下的数据隐藏问题。请参阅以下连结: 要说明该问题,请参见下面的示例。我的目标是将我的长js文件拆分为2个文件,但有些函数需要访问一些私有变量: first.js: (function(context) { var parentPrivate = 'parentPrivate'; })(window.myGlobalNamespace); (function(context) { this.childFunction = console.

我以前遇到过JavaScript模块化下的数据隐藏问题。请参阅以下连结:

要说明该问题,请参见下面的示例。我的目标是将我的长js文件拆分为2个文件,但有些函数需要访问一些私有变量:

first.js:

(function(context) {
    var parentPrivate = 'parentPrivate';
})(window.myGlobalNamespace);
(function(context) {
    this.childFunction = console.log('trying to access parent private field: ' + parentPriavte);
}(window.myGlobalNamespace.subNamspace);
second.js:

(function(context) {
    var parentPrivate = 'parentPrivate';
})(window.myGlobalNamespace);
(function(context) {
    this.childFunction = console.log('trying to access parent private field: ' + parentPriavte);
}(window.myGlobalNamespace.subNamspace);
现在这不起作用了,因为孩子没有访问家长的权限。一个解决方案是让
parentPrivate
公开可见,但这在我的情况下是不可接受的

引用路易的话,他回答了前面的一个问题:

“我们不能有一个孩子可以进入但不对外开放的领域 公共的(即受保护的)。有没有办法做到这一点?”

如果您希望模块化(即,您希望对子级进行编码 与父母分开),我不认为这在中国是可能的 JavaScript。有可能让孩子和家长在家里工作 相同的闭包,但这不是模块化的。这是真实的 或者没有要求

问题是父对象和子对象不在同一个闭包中。因此我在想,创建一个将文件放入同一闭包的库有意义吗

比如:

concatenator.putIntoOneClosure(["public/js/first.js", "public/js/second.js"]);
当然,我们可以使用更多参数来指定名称空间等。请注意,这与我们从RequireJS获得的功能不同。RequireJS实现了模块化,而这个级联器在模块化的条件下专注于数据隐藏


那么上述任何一项都有意义吗?还是我遗漏了一些要点?欢迎任何想法。

如果您需要两个单独的文件中的可用内容,那么您就不能拥有真正的隐私。。。但是,类似的方法可能适用于您:

first.js:

(function(context) {
    var sharedProperties = {
      sharedProp1: "This is shared"
    };

   function alertSharedProp1() {
     alert (sharedProperties.sharedProp1)
   }


   window[context] = { 
     sharedProperties: sharedProperties,
     alertSharedProp1: alertSharedProp1
   };

})("myGlobalNamespace");
(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();
second.js:

(function(context) {
    var sharedProperties = {
      sharedProp1: "This is shared"
    };

   function alertSharedProp1() {
     alert (sharedProperties.sharedProp1)
   }


   window[context] = { 
     sharedProperties: sharedProperties,
     alertSharedProp1: alertSharedProp1
   };

})("myGlobalNamespace");
(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();
根据评论编辑详细答案

(function() {    
   ##include: file1.js##
   ##include: file2.js##    
}());
我所做的是设置一个如下所示的源文件:

master.js

(function() {    
   ##include: file1.js##
   ##include: file2.js##    
}());
然后我编写了一个脚本(在我的例子中是windows脚本),读入
master.js
,然后逐行阅读,查找
##include:filename.js#
行。当它找到这样一行时,它读入include文件并将其转储出去


我的特殊需求是特殊的,因为我正在编写一个浏览器插件,它需要在三种不同的浏览器中工作,并且必须单独包装,但为了我自己的理智,我希望使用单独的文件。

如果我理解正确,您正在使
window.myGlobalNamespace.sharedProperties对每个人都清晰可见。好奇的用户可以随意摆弄它,这是不可取的。你是说
你需要在两个单独的文件中提供的东西,那么你就不能有真正的隐私
,这就是为什么我建议使用一个连接器库,将js文件连接成一个。这有意义吗?简单的连接不行。。。您需要一个更复杂的东西来获取这两个文件,并将两者都打包到一个模块中。这是可能的——我甚至为我的一个项目写了一个——但它不是现成的解决方案。我明白了。这就是我想要的。我知道这不是trivil(我认为eval()会涉及),但这样的库一旦编写好,就可以像RequireJS一样在任何地方使用。也许我会发布另一个问题来清楚地描述这一点。谢谢你的建议。