0

以前、JavaScript のモジュール化でデータが隠蔽されるという問題に遭遇しました。以下のリンクを参照してください。

モジュールパターン - 1 つのモジュールのコードを異なる 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);

子は親にアクセスできないため、これは機能しません。解決策の 1 つはparentPrivate公開することですが、私の場合は受け入れられません。

以前の質問の1つに答えた@Louisを引用:

「子供はアクセスできるが、外部のパブリックにはアクセスできない (つまり、保護された) フィールドを持つことはできません。それを達成する方法はありますか?」

モジュール化が必要な場合 (つまり、子を親とは別にコーディングしたい場合)、JavaScript でこれが可能であるとは思えません。子と親を同じクロージャで動作させることは可能ですが、これはモジュール化されません。これは、RequireJS の有無にかかわらず当てはまります。

問題は、親と子が同じクロージャー内にないことです。したがって、ファイルを同じクロージャーに入れるライブラリを作成することは理にかなっていると思いますか?

何かのようなもの:

concatenator.putIntoOneClosure(["public/js/first.js", "public/js/second.js"]);

もちろん、名前空間などを指定するために、より多くの引数を受け取ることができます。これは、RequireJS から得られる機能と同じではないことに注意してください。RequireJS はモジュール化を実現しますが、この連結子はモジュール化の条件下でのデータの隠蔽に焦点を当てています。

では、上記のいずれかが理にかなっていますか? それとも、いくつかの重要なポイントを見逃していますか? どんな考えでも大歓迎です。

4

1 に答える 1

0

2 つの別々のファイルで利用できるものが必要な場合、真のプライバシーを確​​保することはできません...ただし、次のようなものがうまくいく場合があります。

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##    
}());

master.js次に、読み取り、行を探して行ごとに読み取るスクリプトを (私の場合は Windows スクリプトで) 作成しました##include: filename.js##。そのような行が見つかると、インクルード ファイルを読み取り、それをダンプします。

3 つの異なるブラウザーで動作する必要があり、個別にまとめなければならないブラウザー プラグインを書いていたので、私の特定のニーズは特別なものでしたが、私自身の正気を保つために、個別のファイルで動作するようにしたかったのです。

于 2014-04-30T14:10:06.640 に答える