4

モジュールパターンの後に構造化されたJavascriptオブジェクトがあります。他の兄弟の「プライベート」関数から呼び出されるプライベート関数がいくつかあります。グローバル/外部変数/オブジェクト/関数に誤ってアクセスする可能性なしに、別の変数/関数にアクセスするにはどうすればよいですか?

function doSomething() {
  alert("Something I don't want to do");
}

var My.Namespaced.SingletonClass = (function() {
  var init = function() {
    doSomething();
  }

  var doSomething = function() {
    alert("Something I want to do");
  }

  return {
    "init": init;
  }
})();

My.Namespaced.SingletonClass.init();

私の推測では、上記のコードは実際には正しい内部doSomething関数にアクセスしますが、それ以上のセキュリティが必要です。誤って関数を呼び出したり、シングルトンのスコープ内のオブジェクトをアドレス指定したりすることを恐れずに、内部/ネストされた関数を明示的にアドレス指定するにはどうすればよいですか?

4

1 に答える 1

5

短いバージョン: できません。doSomethingが の兄弟として定義されていない場合、JavaScript は、関数initが見つかるまで、または検索するスコープがなくなるまで、より広いスコープを連続して検索します。doSomething

より長いバージョン: 次のように、プライベート オブジェクトを使用してプライベート ヘルパー関数を保持することで、この種の動作を防ぐことができます。

function doSomething() {
  alert("Something I don't want to do");
}

// Assuming My.Namespaced is already defined:
My.Namespaced.SingletonClass = (function() {
  var helpers = {};

  helpers.doSomething = function() {
    alert("Something I want to do");
  }

  var init = function() {
    helpers.doSomething();
  }

  return {
    init: init
  }
})();

My.Namespaced.SingletonClass.init();

ヘルパー関数が本当に兄弟であることが重要かどうかはわかりません (しかし、それが特に問題になる理由はわかりません)。

また、追加する前に and を定義する必要があることにも注意してMyくださいMy.NamespacedSingletonClassまた、返すオブジェクトのキーに JSON スタイルの引用符を使用する必要はありません。

于 2010-07-27T15:18:12.943 に答える