JavaScript - 如何将新实例设置为参数,动态创建?

时间:2015-05-18 12:58:04

标签: javascript string oop object instance

我有一个方法,它将一个新实例设置为一个动态创建的数组。如果不使用eval()

,我怎么能这样做呢?
var Form = (function(){
    function Form(params){
        this.shapesArray = [];
        this.shape;
        ...
    }

    Form.prototype.submit = function(){
        ... this.shape is the shape selected by the user ...
        this.setShape('new Shapes.' + this.shape + '(arg1, arg2, color)');
    }

    Form.prototype.setShape = function(obj){
        this.shapesArray.push(obj);
    }
return Form;
}());

那么,如何在没有setShape的情况下将new实例传递给eval()方法来调用Form.prototype.submit = function(){ eval('this.setShape(new Shapes.'+ this.shape.capitalize() +'('+ str_params + '))'); } 方法?

到目前为止这是有效的:

eval()

但使用eval()并不是一个好习惯。如何实现同样的结果wighout make

1 个答案:

答案 0 :(得分:3)

您可以使用bracket notation访问该媒体资源:

this.setShape(new Shapes[this.shape](arg1, arg2, color));

现在,如果你从动态数组中得到你的参数,它会更复杂,因为你不能只使用apply

这是一个解决方案:

var constructor = new Shapes[this.shape];
var C = function(){
    return constructor.apply(this, arr_of_args);
}
C.prototype = constructor.prototype;
this.setShape(new C());

但这开始变得棘手且难以阅读。您的应用程序的新设计不涉及具有可变数量参数的动态构造函数可能是更可取的。