2015-05-18 2 views
1

У меня есть метод, который устанавливает новый экземпляр массива, созданный динамически. Как я могу это сделать без использования eval()?JavaScript - Как установить новый экземпляр как параметр, созданный динамически?

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() не является хорошей практикой. Как достичь такого же результата wighout eval()?

ответ

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

Но это начинает становиться сложно и трудно читать. Может быть предпочтительнее новый дизайн вашего приложения, не включающий динамические конструкторы с переменным числом аргументов.

+0

Спасибо. Кажется, он работает. Как передать аргументы, если также аргумент Dyamically создан? Как я могу использовать 'apply'? Что-то вроде 'this.setShape (новые Shapes [this.shape] .apply (null, arr_of_args));' –

+0

@Ezio_ См. Редактирование. Но я, очевидно, не использовал бы что-то настолько сложное, чтобы создавать экземпляры, вероятно, лучший дизайн для вашего приложения (может быть, например, карта фабрик). –

+0

Спасибо человек. Я ценю вашу помощь. –