1


1

JavaScriptのプライベート変数へのアクセスの問題

これはJavaScriptの達人のためのものです:

私は新しいJavaScriptフレームワークを試しています。 その構造は、強力なjQuery以外のものに触発されていません。

`+ $ j +`と呼ばれるグローバル変数があり、.. おお、それを実際に見てください。

/* file: jfoo.js */
$j = new (function(){
    var modules=[];
    this.loadModule = function(mod) {
        modules[ modules.length ] = mod;
    }
    this.hasModule = function(mod) {
        for( ind in modules )
            if( modules[ind]==mod ) return true;
        return false;
    }
})();

モジュールがプライベート変数であることがわかります。 問題ない;それが私の意図したとおりです。

次に、システムに `+ $ j.loadBatch +`メソッドを追加するプラグインを作成します。 So..

/* file: loadBatch.jfoo.js */
!$j || (function(){
    $j.loadBatch = function(batch) {
         for(ind in batch)
             modules[ modules.length++ ] = batch[ind];
     }
})();

しかし、このメソッドはファイル `+ jfoo.js +`のクロージャーの一部ではないため、これは不可能です。

私もこのバージョンを試してみました:

/* file: jfoo.js */
$j = new (function(){
    var modules=[];
    this.loadModule = function(mod) {
        modules[ modules.length ] = mod;
    }
    this.hasModule = function(mod) {
        for( ind in modules )
            if( modules[ind]==mod ) return true;
        return false;
    }
    this.extend = function(extensions) {
        for( ext in extensions )
            this[ext] = extensions[ext];
    }
})();

and

/* file:loadBatch.jfoo.js */
!$j || (function(){
    $j.extend( {
        loadBatch : function(batch) {
            for(ind in batch)
                modules[ modules.length++ ] = batch[ind];
        }
    });
})();

しかし、私はこれ以上の結果は得られませんでした。

だから、質問:

  • で `+ loadBatch `メソッドを書くことができる方法はありますか 個別のファイルで、まだプライベートメソッド ` modules +`にアクセスしていますか? (私は答えが非常に否定的であることを期待しています、しかし、誰が知っていますか?)

  • 希望する効果を達成できる他の方法はありますか `+ modules +`を公開せずに? (私がそれを公にした場合、私はどのように進めるかを知っています)

  • jQueryはプライベートメンバーを使用しますか? どうやって「プライベート」を乗り越えますか アクセシビリティ」問題?

ありがとう、

jrh

1 Answer


3


私の知る限りでは、「プライベートな」変数(クロージャの範囲内にある変数のみ)へのアクセス権をその範囲外の実行コンテキストに与える方法はありませんが、それ以外の方法はありません。 (例えば。 あなたはアクセサメソッドを書くことができましたが、誰がアクセスするかを制限することはできませんでした)