javascript从类名动态创建类实例

时间:2013-10-31 04:43:40

标签: javascript typescript

我有很多代码块,如下所示:

    .....
    var headerEl = document.createElement("div");
    headerEl.id = "headerDiv";
    document.body.appendChild(headerEl);
    var headerBlock = new Header(headerEl);

    var footerEl = document.createElement("div");
    footerEl.id = "footerDiv";
    document.body.appendChild(footerEl);
    var footerBlock = new Footer(footerEl);
    .....

现在我想创建一个将执行上述代码的函数“createBlock”,所以我只需要传递这样的参数

    .....
    var headerBlock = createBlock("headerDiv", Header);
    var footerBlock = createBlock("footerDiv", Footer);
    .....

我试过这个但是没有用

function createBlock (divName, className){
    var myDiv = document.createElement("div")
    myDiv.id = divName;
    document.body.appendChild(myDiv);
    var block = new className(myDiv);
    return block;
}

3 个答案:

答案 0 :(得分:1)

使用应用调用模式或Function.prototype.call

function createBlock (divName, className){
    var myDiv = document.createElement("div")
    myDiv.id = divName;
    document.body.appendChild(myDiv);
    var block = className.call(null, myDiv);
    return block;
}

通过检查Header

,这将要求构造函数Footerthis都是范围安全的
function Header(arg) {
  if(this instanceof Header) {
    //initialise
    return this;
  }
  else {
    return new Header(arg);
  }
}

答案 1 :(得分:0)

function createBlock (divName, className){
    var myDiv = document.createElement("div")
    myDiv.id = divName;
    document.body.appendChild(myDiv);
    var block = new window[className](myDiv);
    return block;
}

var headerBlock = createBlock("headerDiv", "Header");
var footerBlock = createBlock("footerDiv", "Footer");

请注意"Header""Footer"

周围的引号

答案 2 :(得分:-1)

请参阅Dynamically loading a typescript class (reflection for typescript)

您需要使用:

var newInstance = Object.create(window[className].prototype);
newInstance.constructor.apply(newinstance, params);