JavaScript中的动态实例化

时间:2011-02-17 13:07:54

标签: javascript

除了eval之外,还有其他方法可以使用变量参数列表来实例化对象吗?

例如:var foo = instantiate(className, [arg1, arg2, ...])

3 个答案:

答案 0 :(得分:19)

您可以使用如下变量参数列表实例化对象:

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, ...]);

...这使得它与非全局函数兼容。

答案 1 :(得分:6)

在ES5中使用Object.create()

function instantiate(constructor, args) {
    var instance = Object.create(constructor.prototype);
    constructor.apply(instance, args);
    return instance;
}

使用ES6中的spread operator

var foo = new constructor(...args);

答案 2 :(得分:-1)

嗯,你可以随时做到如下。添加到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);
&#13;
&#13;
&#13;