2011-08-23 7 views
7
Burada

Javascript newbie, ben bu işe gidip ben bu orada bilerek buJavaScript nesne oluşturma

createElement = function(name, data){ 
    if(name == TYPES.TEXT){ 
    return new Text(data); 
    } 
    else if(name == TYPES.WORD){ 
    return new Word(data); 
    } 
    else if(name == TYPES.PARAGRAPH){ 
    return new Paragraph(data); 
    } 
    else if(name == TYPES.TABLE){ 
    return new Table(data); 
    } 
    <list goes on and on and on... > 
} 
xz x Bunu yazmanın daha iyi, daha temiz bir yolu.

+0

Bunu [anahtarı yapısında] ilginizi çekebilir (https://developer.mozilla.org/en/JavaScript/Reference/Statements/switch) ... – DaveRandom

cevap

9

Haklısınız, aşırı if..then veya switch mantığı code smell ve hemen hemen her zaman daha zarif bir hale refactored edilebilir konum. http://jsfiddle.net/KkMnd/

EDIT: O çizgiyi Bu durumda, bir isim dayalı bir fabrika

var dictionary = {}; 
dictionary[TYPES.TEXT] = Text; 
dictionary[TYPES.WORD] = Word; 
dictionary[TYPES.PARAGRAPH] = Paragraph; 
dictionary[TYPES.TABLE] = Table; 

createElement = function(name, data){ 
    return new dictionary[name](data); 
} 

Canlı örneğini döndürmek için işlev olarak bu isim olarak anahtar ve değere sahip bir sözlüğüne refactored edilebilir createElement yöntemi, ilk olarak TYPES.* için bir şeyin yapılandırıldığını kontrol edebilir/içermelidir. Bu yöntemi çağırmaya çalışmadan önce sözlükte bir öğe olup olmadığını kontrol etmenin iyi bir yolu vardır.

return (typeof dictionary[name] == 'function') ? new dictionary[name](data) : some_default_value; 
+0

daha iyi onun cevabını gibi. – Prospero

+0

+1 Ve bu çözüm hakkında ekstra iyi olan şey, eğer TYPES'inizin genişletilmesi gerekiyorsa, bunu yapmak için herhangi bir * mantığı * değiştirmeniz gerekmeyecektir, bunu yapmak için “switch” ile yapmanız gerekir. – peirix

+3

+1 bu kalıbın adını (fabrika düzeni) basitleştirmek ve belirtmek için. Beni ilgilendiren şey, OP'nin son "_else_" ifadesinden bahsetmemesi ve bunu burada da uygulamanızdır. 'return (sözlük [isim]! = 'tanımlanmamış')? dictionary [name] (data): something_goes_here; '(hiçbir şey bulunmazsa, beklenen sonuçla birşey 'yerine'). – Tadeck

0

Biraz daha temiz ancak semantik olarak bir anahtar deyimi kullanmak aynı olurdu.

function createElement(name,data){ 
switch(name) 
{ 
case TYPES.TEXT: 
    return new Text(data) 
    break; 
case TYPES.WORD: 
    return new WORD(data) 
    break; 
default: 
    // etc. code to be executed if no values match 
} 
}