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

これには、コンストラクター関数 と の両方がスコープ セーフである必要がありHeaderますFooterthis

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

typescript クラスの動的ロード (typescript のリフレクション) を参照してください。

以下を使用する必要があります。

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