0

我有很多看起来像这样的代码块:

    .....
    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;
}
4

3 回答 3

1

使用 apply 调用模式或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;
}

这将要求构造函数HeaderFooter, 通过检查this

function Header(arg) {
  if(this instanceof Header) {
    //initialise
    return this;
  }
  else {
    return new Header(arg);
  }
}
于 2013-10-31T04:58:34.990 回答
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"

于 2013-10-31T04:53:59.510 回答
-1

请参阅动态加载打字稿类(打字稿的反射)

你需要使用:

var newInstance = Object.create(window[className].prototype);
newInstance.constructor.apply(newinstance, params);
于 2014-03-23T10:14:42.793 回答