【问题标题】:create object from dynamic classname - ReflectionClass in JS?从动态类名创建对象 - JS中的ReflectionClass?
【发布时间】:2011-02-22 23:01:55
【问题描述】:

是否可以在没有邪恶评估的情况下做这样的事情:

var str='MyClass';
eval('new '+str);

我刚刚了解到 PHP 中有 ReflectionClass... 谢谢。

【问题讨论】:

    标签: javascript


    【解决方案1】:

    你可以试试这个:

    var str = "MyClass";
    var obj = new window[str];
    

    这是一个例子:

    function MyClass() {
       console.log("constructor invoked");
    }
    
    var s = "MyClass";
    new window[s]; //logs "constructor invoked"
    

    【讨论】:

    • 完美,谢谢!编辑:哦,我可以将类定义放入一个对象中,而不是使用窗口对象...
    【解决方案2】:

    通过反射创建对象(调用构造函数):

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

    【讨论】:

    • 如果您没有正确验证 evaled 的字符串,这只有不好。除此之外,这个答案很棒。当前接受的答案在类可全局访问(即在窗口级别)时有效。例如,在闭包中定义的类不能使用window 方法进行实例化。
    • @ElliotB。在这种情况下,您可以使用this 来引用当前范围。啦new this[className]
    • @JacobRelkin 这似乎不起作用。我用几种不同的方式构建了一个范围引用的测试:jsfiddle.net/d84bh/1 它仅在类在全局/窗口级别定义时对我有效:jsfiddle.net/d84bh/2
    猜你喜欢
    • 1970-01-01
    • 2019-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-02
    • 1970-01-01
    • 1970-01-01
    • 2011-01-21
    相关资源
    最近更新 更多