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

时间:2014-04-30 10:23:23

标签: javascript requirejs module-pattern modularization data-hiding

我之前遇到过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实现了模块化,而这个连接器专注于模块化条件下的数据隐藏。

上述任何一个都有意义吗?还是我错过了一些重点?欢迎任何想法。

1 个答案:

答案 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##行。当它找到这样一行时,它会在包含文件中读取并将其转出。

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