9

コンストラクターの名前を取得する一般的な方法を見つけようとしています。私の目標は、KnockoutJS の設定フレームワークより規約を作成することです

私の考えは、ウィンドウ内のすべてのオブジェクトを反復処理することです。探しているコンストラクターが見つかったら、インデックスを使用してコンストラクターの名前を取得できます

コードソファー

(function() {
    constructors = {};
    window.findConstructorName = function(instance) {
        var constructor = instance.constructor;
        var name = constructors[constructor];
        if(name !== undefined) {
            return name;
        }

        var traversed = [];
        var nestedFind = function(root) {       
            if(typeof root == "function" || traversed[root]) {
                return       
            }

            traversed[root] = true;
            for(var index in root) {               
                if(root[index] == constructor) {
                    return index;
                }


                var found = nestedFind(root[index]);  
                if(found !== undefined) {
                    return found;
                }
            }
        }

        name = nestedFind(window);
        constructors[constructor] = name;
        return name;
    }
})();

var MyApp = {};
MyApp.Foo = function() {
};

var instance = new MyApp.Foo();
console.log(findConstructorName(instance));     

問題は、私がPermission denied to access property 'toString'例外を取得することです.catchを試みることさえできないので、どのオブジェクトが問題を引き起こしているかを確認してください

フィドルhttp://jsfiddle.net/4ZwaV/

このフィドルの最終バージョン http://jsfiddle.net/2Uvd5/8/

私のConvention over Configurationプラグインの胚については、こちらをチェックして ください https://github.com/AndersMalmgren/Knockout.BindingConventions

4

1 に答える 1

5
  • 編集2:

JSFiddle

これは、1 つのことを除いてすべてを解決します:に追加var MyApp = {}; しませんwindow-object。それを変更するwindow.MyApp = {};と、完全に機能します(IFrame内であっても)。


  • 編集1:

JSFiddle

キー名を設定して配列に追加するには、キー名を文字列にする必要があるため、Javascript が自動的に呼び出されます。toString()特定のオブジェクトでは失敗する、提案されたキー名について。代わりに .push() を使用して、任意の型の要素を配列に追加し、.indexOf()それが既に存在するかどうかを確認します。

に配置されているため、jsFiddle がまだ壊れていることに注意してくださいiframe新しいタブで開くと解決します。


以前の回答(jsFiddle で検証しようとしたときに無効であることが判明しました):

コンストラクターが正確なオブジェクトであるかどうかを確認する必要があります。それから .toString() を呼び出すと、セキュリティ例外が発生し、デバッグが少し難しいことがわかりました。これは、私が使用する var-dumper 内のオブジェクトのタイプを取得するために使用する関数です。

function GetTypeOfObject(obj) {
    if (obj.constructor === window.Object)
        return '[object]';
    else
        return obj.constructor.toString();
}
于 2012-12-13T17:38:19.507 に答える