是有可能做這樣的事情沒有邪惡的eval:從動態類名創建對象 - JS中的ReflectionClass?
var str='MyClass';
eval('new '+str);
我剛剛得知有ReflectionClass在PHP ... 感謝。
是有可能做這樣的事情沒有邪惡的eval:從動態類名創建對象 - JS中的ReflectionClass?
var str='MyClass';
eval('new '+str);
我剛剛得知有ReflectionClass在PHP ... 感謝。
你可以試試這個:
var str = "MyClass";
var obj = new window[str];
下面是一個例子:
function MyClass() {
console.log("constructor invoked");
}
var s = "MyClass";
new window[s]; //logs "constructor invoked"
創建對象(調用構造函數)通過反射:
SomeClass = function(arg1, arg2) {
// ...
}
ReflectUtil.newInstance('SomeClass', 5, 7);
和實施:
/**
* @param strClass:
* class name
* @param optionals:
* constructor arguments
*/
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();
};
'eval()'==糟糕。 – 2012-01-17 16:46:37
如果您沒有正確驗證字符串是否爲'eval'ed,那麼*僅* *很糟糕。除此之外,這個答案很棒。目前接受的答案*只適用於全球可訪問的類別(即在窗口級別)。例如,在閉包中定義的類不能使用'window'方法實例化。 – 2014-06-18 23:34:13
@ElliotB。在這種情況下,您可以使用'this'來引用當前範圍。 la'new this [className]' – 2014-06-19 16:28:34
+1對我來說沒有邪惡。 – user113716 2011-02-22 23:18:20
完美,謝謝! 編輯:哦,我可以把類定義到一個對象,而不是使用窗口對象... – kubi 2011-02-23 10:43:07