2011-03-07 5 views
0

名前が動的に決定されるオブジェクトで関数を呼び出すときに問題が発生します。以下のコードは、私のコードが現在どのように設定されているかを示しています。問題は、doSomethingElse()という関数で発生しています。動的に生成されたオブジェクト名で関数を呼び出そうとしています

var Obj = function(){ 
    this.test = this.objMgr(); 
}; 


Obj.prototype.objMgr = function(){ 

    var self = this; 


    function doSomething(){ 
      //do some processing that seems unimportant to this particular prob 

      doSomethingElse(); 
    } 


    function doSomethingElse(){ 

      //The object that I need is determined at runtime, and is therefore dynamic 
      var callFuncOnThis = 'subObj'; 

      //How the heck can I call function a on the object referenced in callFuncOnThis 
      this[callFuncOnThis].a(); //Doesn't work, this refers to dom window 
      self[callFuncOnThis].a(); //Doesn't work, self refers to obj 
      eval(callFuncOnThis).a(); //Works, but is there a better way? 
    } 


    var subObj = { 
      a:function(){ 
      }, 
      b:function(){ 
      } 
    }; 


    var subObj2 = { 
      a:function(){ 
      }, 
      b:function(){ 
      } 
    }; 


    doSomething(); 

    return{ 
     subObj:subObj, 
     subObj2:subObj2 
    } 

}; 

var test = new Obj(); 
+3

タイトルに質問を簡単に記入してください。 *別のJavascript OOの質問*は実際にそれをしません。 – alex

答えて

0

subObjは決して参照できるスコープに割り当てられません。それがeval()があなたの最善の解決策である理由です。これを言って、私は奇妙なコードを探しています。あなたは少しそれについて詳しく説明できますか?私は建築上の問題があるように感じます。

また、subObjとsubObj2を含むオブジェクトを返すので、なぜあなたのスコープとしてそれを使用しないでください。

function doSomethingElse(){ 
    // ... 
    retObj[callFuncOnThis].a() 
} 

var retObj = {'subObj': subObj, 'subObj2': subObj2}; 

doSomething(); 

return retObj; 
+0

どこから始めたらいいかわかりません。私は建築上の問題もあるかもしれないと思う。私はまだ比較的新しいjsです。とにかく、質問のコードは私が構築しているjqueryプラグインの小さな部分です。プラグインには、同時に使用できるいくつかの異なる「コンポーネント」があります。これらは上記のコードのsubObjsです。プラグインは、基本セットの初期化を実行し、ユーザーが選択したコンポーネントをループし、それぞれのinit関数を呼び出します。実際にdoSomethingElseのコードの周りにループがあります。 –

+0

あなたは私を失った。しかし、ポイントは、あなたが返すオブジェクトは(私のコードのように)明示的に定義され、 'subObj2'のスコープとして使うことができるということです。 – Dimitry

+0

完璧に動作し、理にかなっています。ありがとう! –

関連する問題