1

次のJavaScriptコードを検討してください。関数定義はすべて同じことを達成しているようです。戻り辞書オブジェクトで「明らかに」される関数を定義するための推奨される規則はありますか?

var testModule = (function(){
      var counter = 0;

      var localFunc1 = function() {
        return "local 1";
      }

      function localFunc2() {
        return "local 2";
      }

      this.localFunc3 = function() {
        return "local 3";
      }

      localFunc4 = function() {
        return "local 4";
      }

      return {      
        proxy1: localFunc1,
        proxy2: localFunc2,
        proxy3: localFunc3,
        proxy4: localFunc4
      };
    })();
4

2 に答える 2

2

本当に好ましい方法はないと思います。私が見た中で最も一般的なセットアップでは、すべてのメソッドをローカルとして作成し(varを使用)、パブリックメソッドを公開するオブジェクトを返します。

注意すべき点がいくつかあります。

  • this.localFunc3は、オブジェクトが「new」キーワードでインスタンス化されている場合にのみ機能します
  • オブジェクトを返すときは、各関数から()を削除して、関数の戻り値ではなく、関数への参照を返すようにします。
  • localFunc4は、前に「var」キーワードがないため、グローバルになります。

このようなモジュールパターンで作業するとき、私は次のようなものを探す傾向があります。

var Obj = ( function () {
    var private_static = 'this value is static';
    return function () {
        //-- create return object
        var _self = {};
        //-- create private variables
        var private_variable = 'this value is private';
        var func1 = function () {
            return 'value 1';
        };
        //-- attach public methods
        _self.func1 = func1;
        //-- return the object
        return _self;
    };
} )();

この方法に関する注意事項:

  • プライベート静的変数を許可します(プライベート静的変数が必要ない場合は、クロージャーを削除できます)
  • 最初に_self参照を作成することにより、親への参照を必要とする、内部からインスタンス化されたオブジェクトへの自己参照を渡すことができます。
  • _self.whateverまたはthis.whateverがなくても、すべての内部関数を参照できるのが好きです。プライベートかパブリックかを無視します。
于 2012-04-10T14:31:23.503 に答える
1

定義はまったく同じことを達成しません。

  • var localFunc1同じことをfunction localFunc2行い、外部関数内でのみ使用可能な関数を作成します。

  • this.localFunc3localFunc4は実際にはローカル関数ではありません。どちらもオブジェクトに属しwindowます(thisそのコンテキストではwindow、でありlocalFunc4、ステートメントなしで宣言されますvar)。

したがって、後者の2つはすでにグローバルであるため、返されたオブジェクトに公開する必要はありません。そして、実際には、戻りオブジェクトで関数を公開していません。それぞれを呼び出すため、戻り値を公開しています。あなたはこれをやろうとしていましたか?

return {      
   proxy1: localFunc1,
   proxy2: localFunc2,
   proxy3: localFunc3,
   proxy4: localFunc4
};

:ダグラス・クロックフォードがJavaScriptで継承を処理する複数の方法を説明しているこのビデオをご覧になることをお勧めします。彼が「寄生的継承」と呼んでいるものを探していると思います。

于 2012-04-10T14:37:32.083 に答える