Помимо eval, существует ли другой способ создания объекта с помощью списка переменных аргументов?
Например: var foo = instantiate(className, [arg1, arg2, ...])
Помимо eval, существует ли другой способ создания объекта с помощью списка переменных аргументов?
Например: var foo = instantiate(className, [arg1, arg2, ...])
Вы можете создать экземпляр объекта с помощью списка переменных аргументов следующим образом:
function instantiate(className, args) {
var o, f, c;
c = window[className]; // get reference to class constructor function
f = function(){}; // dummy function
f.prototype = c.prototype; // reference same prototype
o = new f(); // instantiate dummy function to copy prototype properties
c.apply(o, args); // call class constructor, supplying new object as context
o.constructor = c; // assign correct constructor (not f)
return o;
}
Боковое примечание: вы можете передать прямую ссылку на функцию конструктора классов:
var foo = instantiate(Array, [arg1, arg2, ...]);
// Instead of:
var foo = instantiate("Array", [arg1, arg2, ...]);
..., что делает его совместимым с неглобальными функциями.
Используя Object.create() в ES5:
function instantiate(constructor, args) {
var instance = Object.create(constructor.prototype);
constructor.apply(instance, args);
return instance;
}
Используя оператор распространения в ES6:
var foo = new constructor(...args);
Хорошо, вы всегда можете сделать следующее. Все, что добавлено в прототип Dino, можно разделить между создаваемыми объектами. Отличие от обычного шаблона конструктора заключается в том, что объекты-экземпляры не должны иметь одинаковые частные свойства. Они могут быть установлены динамически для каждого из них.
function Dino(a,b){
for(i = 0; i< a.length; i++) this[a[i]] = b[i];
}
var props = ["foo", "bar"],
values = [42, 37],
obj = new Dino(props,values);
console.log(obj);