3

私は実際に答えを見つけたことがないので、ついにこの質問をします。次のような構造のjavascriptオブジェクトがある場合:

var someObj = {

    "categoryA" : {
        "func1" : function(){},
        "func2" : function(){},
    },

    "categoryB" : {
        "func3" : function(){},
        "func4" : function(){},
    }

}

func4呼び出したいfunc2。言わずに呼び出す方法はありsomeObj.func2()ますか?これは、アプリケーションの名前を簡単に変更できないようにし、内部機能をより緊密に結合しているように見えるため、醜いように思われます。それとも、これは通常の編成方法であり、問​​題とは見なされていませんか?

4

3 に答える 3

1

オブジェクト宣言はいつでも次のようなものに屈折させることができます:

var someObj = (function() {

    function func1(){}
    function func2() {}
    function func3() {}

    function func4() {
        func2();
    }

    var self = {
        "categoryA" : {
            "func1" : func1,
            "func2" : func2,
        },

        "categoryB" : {
            "func3" : func3,
            "func4" : func4,
        }
    };

    return self;
}());

これは一般に「モジュールパターン」と呼ばれます。

于 2012-06-17T21:40:51.777 に答える
1

以下の理由により、実際には不可能です。次のようなものを想像してみてください。

var obj1 = {}, obj2 = {};

var categoryA = {
    "func1" : function(){},
    "func2" : function(){},
};

var categoryB = {
    "func3" : function(){},
    "func4" : function(){},
};

obj1.categoryA = categoryA;
obj1.categoryB = categoryB;

obj2.categoryA = categoryA;
obj2.categoryB = categoryB;

あなたはそれobj2.categoryB.func4()が何をすべきかわからないことがわかります。

于 2012-06-17T21:47:50.600 に答える
1

モジュール内で使用するために「プライベート」変数名(私の例では「me」)を使用し、外部で使用するために別の変数(「someObj」)に「エクスポート」することができます。

var someObj = (function(){
  var me = {
    A:{
      fn1:function() {return 1}
    },
    B:{
      fn2:function() {return me.A.fn1()}
    }
  };
  return me;
})();

someObj.B.fn2()
于 2012-06-17T21:53:43.837 に答える