2

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

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

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

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

事前にどうもありがとう

編集

回答ありがとうございます。

ありがとう、Tronix117、これが問題だった!!

ありがとう、ベンジャミン・シュルテ、機能のために!

4

3 に答える 3

5

コンソールで試す場合:

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

つまり、window の範囲にない何かにアクセスしようとしているということです。それは次のようなものであるべきです: window.something["A"] something。それ以外の場合は、これを使用します。これははるかに高速であるためです。

于 2012-04-19T12:57:06.920 に答える
3

あなたはこのようにすることができます(私があなたを正しく理解していれば):

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();

まだ最適化できますが、この方法で動作するはずです。

于 2012-04-19T12:51:59.920 に答える
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);

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

于 2012-04-19T12:55:20.683 に答える