2013-10-31 110 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