0

これをより良い形に書き直すことはできますか?

function F() { return F.f(); } //wrapping :(
F.f = function() { /* code1 */ }
F.g = function() { /* code2 */ }

F.f = some_other_function
F.g() //this still works :D

F のインスタンスを作成するつもりはありません。一種の名前空間として使用するだけです。
私は次のことを試みましたが、Fg は保持されません (理由は理解できますが、Fg のようなバインディングではなく、F のコードと動作を変更できるようにするための適切な回避策が必要です):

function F() { /* code1 */ } //no wrapping :D, no need for F.f
F.g = function() { /* code2 */ }

F = some_other_function
F.g() //this points to nowhere now :(

編集: のラッパーとして Ff をもう使用する必要はありませんcode1

EDIT2: コードの最初の部分は有効な JS であり、私が望む動作をしています。問題は、私が Ff をまったく使用しなければならないことが気に入らないことです。2番目のコードのようにやりたいのですが、それでもFgが機能しています。実行時のある時点で、他のすべてをそのままにしておき
たいと思います。code1

4

2 に答える 2

3
var F = {
    f: function() {
        /* code1 */
    },
    g: function() {
        /* code2 */
    }
 };

F.f = function() { /* redefine F.f() */ }
// or
delete F.f;

F.g(); // still works

-

質問の明確化からの更新された回答

これはこれを達成する方法ですが、このアイデア全体は少しずれています。なぜこのパターンが必要なのかわかりません。

function generate() {
    var f = function() {
        /* code1 */
    };

    var ret_val = function() {
        f();
    };

    ret_val.g = function() {
        /* code2 */
    };

    ret_val.setBehaviour = function(new_func) {
        f = new_func;
    };
}

F = generate();

F(); /* code1 */
F.g(); /* code2 */

F.setBehaviour(function() { /* redefine F() */ });
F.g(); /* code2 still works */

F(); /* new behaviour */
于 2013-02-15T20:10:58.843 に答える
0

どうですか:

var F = (function() {
  console.log("Something..");

  return function() {
    function g() {
      console.log("I'm G!");
    }
  };
})();

F.g();

これで、何かを初期化して(Ffで必要なように見えます)、Fgを保持できます。

于 2013-02-15T20:21:48.800 に答える