2017-08-01 7 views
2

私はいくつかの異なるアプリケーションで使用されるAPIのラッパーを作成しています。window.objectのプライベート関数を実装する

私はグローバルオブジェクトを使用していて、さまざまな機能をそのオブジェクトに異なるキーとして配置しています。だから私は持っています:

window.globalContainer = { 
    APIEndpoint1: function(){ 
    make API call and resolve result 
    }, 
    APIEndpoint2: function(){}, 
    ... 
} 

APIコールのすべての肉は直接関数にあります。つまり、コンソールからwindow.globalContainer.APIEndpoint1に行き、関数全体を見ることができます。

これは一般に、複数のアプリケーションで使用され、ヘルパーライブラリとして機能するものにとって悪い習慣ですか?それともこれは受け入れられますか?私はコンソールでjQueryを見て、それは同じことの多くを行うように見えました。それが嫌になった場合、グローバルオブジェクト内にプライベート関数を実装するにはどうすればよいですか?

答えて

1

開始するには良い場所は、匿名のクロージャです:これらで

(function (global) { 
    var foo = global.foo || {}; 
    //accessible 
    foo.publicVar = 5; 
    foo.publicFcn = function (a, b) { 
     privateFcn(a, b); 
     ... 
    }; 
    //not accessible 
    var privateVar = 5; 
    function privateFcn(a, b) { 
     ... 
    } 

    global.foo = foo; 
})(window) 

あなたはかなり直感的に名前空間を汚染し、ライブラリを構築し、ないすることができます。

アクセス可能にする変数と関数を明示的に指定します。

+0

@ m-davis、私はwindow.fooに結ばれた複数のオブジェクトを持っています。 'foo.bar.get'を追加する唯一の方法は、' foo.bar = {} 'で' foo.bar'を最初にインスタンス化することですが、エラーに遭遇しています。これらの新しいオブジェクト? –

+0

@私が知っている限り、それは最良の方法です。 'foo.bar = {get:function(params){return baz;}、set:function(param){return baz = param;}}'よりコンパクトに行うことができます。また、 'global.foo'文の直前まで待って、' foo.bar = bar'と言うこともできます。そうすれば、 'bar'をその文の上の関数、オブジェクト、または変数にすることができます。 (注意して、 'var bar = {};'または 'function bar(...){...} 'をインスタンス化する必要があります) –

+0

入手しました。助けてくれてありがとう –

0

IIFEを使用して、プライベート関数/プロパティを実装できます。

window.globalContainer = function() { 
     //what ever you define here is not accessible outside. Only the API in 
     //the returned object is accessible outside 

     function private1() { 
      make API call and resolve result 
     } 

     return { 
      APIEndpoint1: function(){ 
      private1(); 
      }, 
      APIEndpoint2: function(){}, 
      ... 
     } 
    }();