0

私はこのようなことができるようにしたい:

var MyObject = function(prop) {
  this.property = prop;
};

var stringVar = 'MyObject';

var myObject = new stringVar(1);  // This doesn't work.

assertTrue(myObject.property === 1);

私はこれがうまくいくことを知っています:

var myObject = new window[stringVar](1);

しかし、それを達成するためのより文脈中立的な方法があるかどうか疑問に思っていました.

補足として:私は明らかに使用を避けようとしてeval()います。

4

3 に答える 3

3

これは Javascript の既知の制限です。コンテキストに依存しない方法で文字列によって関数を参照する方法はありません。あなたが持っているものは、あなたができるすべてです。

したがって、これらすべてを 1 つのクロージャーに含めると、うまくいきません。唯一のオプションは、コンストラクターを別のオブジェクトのメソッドとして持つことです。

var constructors = {
    MyObject: function(prop) {
        this.property = prop;
    }
}

var stringVar = 'MyObject';

var myObject = new constructors[stringVar](1);
于 2012-05-25T16:45:00.423 に答える
2

名前空間を使用して、階層を常に把握します。たとえば、次は、Windowsスクリプトホスト(がない場合window)で実行されるデスクトップ.jsファイルで機能します。

var MyNameSpace = {};

MyNameSpace.MyObject = function(prop) {
  this.property = prop;
};

var stringVar = 'MyObject';
var myObject = new MyNameSpace[stringVar](123);
于 2012-05-25T16:50:22.590 に答える
0

これがあなたが望むものかどうかわからない:

var obj = {"myObject": function(prop) {this.property = prop; return this;},
           "MySecondObject": "probably second function"
          },
    str = "myObject";
var myChildObj = obj[str]("test");
alert(myChildObj.property);

jsfiddle

于 2012-05-25T16:45:56.900 に答える