我有一个方法,它将一个新实例设置为一个动态创建的数组。如果不使用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
?
答案 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());
但这开始变得棘手且难以阅读。您的应用程序的新设计不涉及具有可变数量参数的动态构造函数可能是更可取的。