2011-01-26 19 views
0
var a, kdApi; 
a = (function() { 
    function a() {} 
    a.prototype.b = function() { 
    return "foo"; 
    }; 
    return a; 
})(); 
kdApi = (function() { 
    function kdApi(className, funcName) { 
    if (typeof [className] !== "undefined" && ([className] != null)) { 
     eval("cu= new " + className + "()"); 
     if (cu[funcName]) { 
     console.log("class and function exists"); 
     } else { 
     console.log("class does, function doesn't"); 
     } 
    } else { 
     console.log("both class and function doesn't."); 
    } 
    } 
    return kdApi; 
})(); 
new kdApi("w", "b"); 

これを実行すると、クラスと関数の両方が存在しないというメッセージが表示されますが、代わりにwが定義されていないというエラーが表示されます。私は間違って何をしていますか?また、私はevalなしでそれを行うことはできますか?クラスと関数の存在を確認する方法は?

答えて

1

JavaScriptに存在する関数を見る標準的な方法は、現在のスコープ内にあるかどうかをテストすることです。したがって、イディオム:

if (funcName) { 
    funcName(); 
} 

私はそれがコンストラクタ関数であるかどうかを確認するために類似したものがあると信じて、私はよく分かりません。

2
var a, kdApi; 
a = (function() { 
    function a() {} 
     a.prototype.c = 1; 
     a.prototype.b = function() { 
     return "foo"; 
     }; 
    return a; 
})(); 

kdApi = (function() { 
    function kdApi(className, funcName) { 
    if (className != null && className in window) { 
     if (funcName != null && funcName in window[className].prototype && 
      typeof window[className].prototype[funcName] == "function") { 
     document.write("class and function exists"); 
     } else { 
     document.write("class does, function doesn't"); 
     } 
    } else { 
     document.write("both class and function doesn't."); 
    } 
    } 
    return kdApi; 
})(); 

function testCF(clazz, func) { 
    document.write("test for " + clazz + "." + func + "(): "); 
    new kdApi(clazz, func); 
    document.write("<br/>"); 
} 

testCF("a", "b"); 
testCF("a", "c"); 
testCF("k", "b"); 
testCF("k", "c"); 
testCF(null, "c"); 
testCF("a", null); 

ライブデモ:これはかなり近いクローム10.0.642.2 devの

+0

下で試験http://jsbin.com/ufubi5/5

、それはちょうど私の場合には、そうでない、クラス名がウィンドウに添付されていることを前提としています。ここで私の解決策は、それはevalで動作します、私はそれが安全だと思います:http://pastie.org/1500473 – Devrim

関連する問題