2012-04-19 20 views
2

私は、webapp.core.cf1やBackbone.Routerのようなコンストラクタ関数を持っています。しかし、私は参照としてではなく、文字列として、このコンストラクタ関数を取得!私はこの要件、constrを変更することはできません。文字列にする必要があります。 classfun( "Backbone.Router")のように、これからどのようにして新しいオブジェクトを作ることができますか?コール文字列コンストラクタ関数

function classfun (cfstr) 
{ 
    ... 
    cf = new window[cfstr](); 

私がこの方法で試してみると、エラーが出ます:...はコンストラクタではありません。

なぜこれが機能しないのですか? eval()を使用せずに別の方法がありますか?

おかげでたくさん事前に

EDIT

は、あなたの答えありがとうございました!

ありがとう、Tronix117、これが問題でした!

Benjamin Schulteさん、ありがとうございました!

function getObjectByName(name) { 
    var nameParts = name.split('.'); 
    var nameLength = nameParts.length; 
    var scope = window; 

    for (var i=0; i<nameLength; ++i) { 
     scope = scope[nameParts[i]]; 
    } 

    return scope; 
} 

var ObjectClass = getObjectByName(cfstr) 
new ObjectClass(); 

はまだ最適化することができますが、このように動作する必要があります

+0

完全な例がありますか?おそらく、http://jsfiddle.netで? –

+0

また、実際に何が起こりたいのかのサンプルコード? – Joseph

+0

'classfun'はどうやって呼びますか?どんな種類の変数を渡していますか? – Quentin

答えて

5

あなたのコンソールにしようとした場合:手段は、あなたがウィンドウの範囲内にない何かにアクセスしようとしているようにするため

var A=function(a){this.test=a}; 
b = new window["A"](3); 
console.log(b.test); // return 3 

、それはむしろ、そのようなものでなければなりません。window.something [」 A "]の場合、somethingが何であるかわからない場合は、Benjaminの機能を使用する必要があります。

+0

クラス名のプロパティのための 'window'オブジェクトをチェックする良いものです。これは私が持っていた問題を解決しました。ありがとう! – Derek

+0

彼の質問には尋ねられませんが、ブラウザ以外のjsではどうでしょうか? – catbadger

+0

@catbadger常にトップレベルのオブジェクトがありますが、ブラウザ環境ではnode.jsや 'window'のような非ブラウザ環境では通常は' global'です。 cross-env(ブラウザー+非ブラウザー)にしたい場合は、スクリプトの最初に 'typeof global === 'undefined' &&(window.global = window)'を実行し、 'global'を使用しますあなたが必要とするどこでも。したがって、上記の例では、 'b = new global ['a'](3)'を実行します。 – Tronix117

3

あなたは(私が正しくあなたを理解している場合)、このようにそれを行うことができます。

1
ReflectUtil.newInstance = function(strClass) { 
    var args = Array.prototype.slice.call(arguments, 1); 
    var clsClass = eval(strClass); 
    function F() { 
     return clsClass.apply(this, args); 
    } 
    F.prototype = clsClass.prototype; 
    return new F(); 
}; 

SomeClass = function(arg1, arg2) { 
    // ... 
} 

ReflectUtil.newInstance('SomeClass', 5, 7); 

これにより、名前でオブジェクトをインスタンス化し、必要に応じてパラメータを渡すことができます。