2016-03-24 17 views
-1

Bunu komut satırından çözmeye çalışıyorum: İlk kurucuya sağlanan argümanlarla adlandırılan parametrelerle kurucular oluşturmak için bir kurucu kullanmak için şık bir yol var mı? Diyelim ki hayvan gruplandırmaları için bir kurucu istiyoruz. Grup oluşturucu, yeni kurucunun alacağı parametreleri adlandıran argümanlar alır. Yeni kurucu değişken ataması ile adlandırılmıştır. Daha sonra yeni kurucuda bu parametreleri bir nesne üzerinde özellikler olarak belirleyebiliriz (daha önce değişken atamamızla adlandırılmış). O işlevselliği biraz böyle bir şey arayacakları: Ben "kurucu kurucular", "dinamik fonksiyon adı atama" ve "dinamik javascript yapıcı" konulu yaptığım aranmasıHerkes kurucu bir kurucu yapmak için elverişli bir yol biliyor mu?

var herd = new grouping("species", "color", "cattle"); 
var school = new grouping("species", "color", "dolphins"); 
console.log(new herd(20, "Angus", "black")); 
herd({ 
    cattle: 20, 
    species: "Angus", 
    color: "black" 
}) 
console.log(new school(2, "Bottlenose", "grey")) 
school({ 
    dolphins: 2, 
    species: "Bottlenose", 
    color: "grey" 
}) 

, bu gibi görünüyor ben bu kaçınılmaz olarak dağınık. Eğer öyleyse, bu DRY'yi unutmanın bir örneğini yapar mı?

+3

Neden parametre olarak tek bir nesne kullanmayın? –

+0

Bunun gerçek kullanım durumu nedir? –

+0

@Michal node-json-db kullanan bir sms arabirim uygulaması yazıyorum; JSON dosyalarını db olarak kullanıyorum. Paylaşım mantığı yazdığım sınıflar - varsayılanları, yöntemleri ve yapıcıları - benim JSON db kullanımı tarafından zorunlu kılındı. –

cevap

0

İstediğiniz şeyi yapar. Eğer biz bu fonksiyonların değil ihtiyaçları "örneklerini" do beri new ile bu aramak zorunda unutmayın:

function grouping(...keys) { 
 
    return function (...values) { 
 
    return keys.reduce((obj, key, i) => (obj[key] = values[i], obj), {}); 
 
    } 
 
} 
 

 
var herd = grouping("species", "color", "cattle"); 
 
console.log(herd(20, "Angus", "black"));

Ama doğrudan nesne değişmezleri kullanmak yerine böyle yapıyorsun eğer Sadece anahtar isimleri tekrarlamamak için kararınızı tekrar gözden geçirin. herd veya school'u oluşturan çağrılara bakmadan, argümanların hangi sırayla geçeceğini bilmezsiniz. Eğer gerçekten (eğer prototip faydalanmak eğer sadece mantıklı olan) bir yapıcı jeneratör istiyorsanız, o zaman bunun yerine bunu yapabilirsiniz

var obj = { 
    cattle: 20, 
    species: "Angus", 
    color: "black" 
}; 

: sadece nesne değişmezleri kullanarak daha fazla sürdürülebilir olacağını görünüyor

function grouping(...keys) { 
 
    return function (...values) { 
 
    keys.forEach((key, i) => this[key] = values[i]); 
 
    } 
 
} 
 

 
var Herd = grouping("species", "color", "cattle"); 
 
console.log(new Herd(20, "Angus", "black"));