2013-10-31 114 views
0

我有代码的许多块看起来像这样:的JavaScript动态地从一个类名创建类的实例

..... 
    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”,将做上面的代码,所以我只是必须在PARAMS通过这样

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

回答

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

这既需要构造函数,HeaderFooter,通过检查this

是范围安全
function Header(arg) { 
    if(this instanceof Header) { 
    //initialise 
    return this; 
    } 
    else { 
    return new Header(arg); 
    } 
} 
+0

宣布这应该工作如果我不能编辑Header和Footer类来检查'this'怎么办?在不检查'this'的情况下,我总是会得到'undefined'。 –

+0

然后你的函数可能会抛出一个错误,因为'this'将引用null。检查这个例子:http://jsbin.com/OWUhIBo/1/edit –

+0

还有一件事,我使用TypeScript,所以如果我可以编辑Header,Footer类来检查'this',TypeScript将会抛出这个编译时错误:'函数'构造函数'具有不一致的返回点。此检查报告任何JavaScript函数实例,它们在某些情况下返回值并在其他情况下返回没有值。尽管是合法的,但这样的代码几乎肯定代表编程错误。' –

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"

+0

我已经试过这一点,得到这个错误: 类型错误:窗口[类名]是不是构造 –

+0

如果类在全球范围内 – Sebas