0

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

模块模式 - 如何将一个模块的代码拆分成不同的 js 文件?

JavaScript - 提取函数同时保持私有

为了说明问题,请参见下面的示例。我的目标是将我的长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实现了模块化,而这个concatenator专注于模块化条件下的数据隐藏。

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

4

1 回答 1

0

如果您需要两个单独文件中的可用内容,那么您将无法拥有真正的隐私……但是,类似于此的内容可能对您有用:

第一个.js:

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

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


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

})("myGlobalNamespace");

第二个.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();

根据评论编辑详细答案

我所做的是设置一个如下所示的源文件:

大师.js

(function() {    
   ##include: file1.js##
   ##include: file2.js##    
}());

然后我写了一个脚本(在我的例子中是windows脚本),它读入master.js然后逐行阅读以寻找这些##include: filename.js##行。当它找到这样的一行时,它会在包含文件中读取并将其转储出去。

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

于 2014-04-30T14:10:06.640 回答