2011-10-05 27 views
5

संभव डुप्लिकेट:
Use of .apply() with 'new' operator. Is this possible?उपयोग एक समारोह निर्माता के साथ लागू

मैं 5 है या रूप

var analyteSelection = new TemplatedSelectionContainer($('.analyte-container', this), helpers, optionsTemplate); 
var instrumentSelection = new AssetBackedSelection($('.instrument-container', this), helpers, optionsTemplate, Assets.instruments, 'Instrument'); 
var methodSelection = new AssetBackedSelection($('.method-container', this), helpers, optionsTemplate, Assets.methods, 'Method'); 

आप देख सकते हैं के 6 चर कार्य, एक इन कन्स्ट्रक्टरों का महत्वपूर्ण हिस्सा बहुत समान है। यह अच्छा होगा अगर मैं एक छोटे से सामान्य currying बिल्डर कि मेरे जैसे कुछ करने के लिए अनुमति होगी बना सकते हैं:

var newSel = selectionContainerBuilder(this, helpers, optionsTemplate) 
var analyteSelection = newSel(TemplatedSelectionContainer, '.analyte-container'); 
var instrumentSelection = newSel(AssetBackedSelection, '.instrument-container', Assets.instruments, 'Instrument'); 
var methodSelection = newSel(AssetBackedSelection, '.method-container', Assets.methods, 'Method'); 

मैं

var selectionContainerBuilder = function(ctx, helpers, optionsTemplate) { 
    return function(FuncDef, selector, a, b, c, d, e, f) { 
    return new FuncDef($(selector, ctx), helpers, optionsTemplate, a,b,c,d,e,f); 
    } 
} 

लेकिन गंभीरता से ick के साथ इसी तरह कुछ हासिल कर सकते हैं। मैं केवल पहले तीन ज्ञात पैरामीटर को तर्क एसईआर की शुरुआत में विभाजित करने और इसे FuncDef पर लागू करने में सक्षम होना चाहता हूं लेकिन मुझे नए ऑपरेटर का उपयोग करने की आवश्यकता से फंसाया जा रहा है।

और किसी से पूछने से पहले, मैं FuncDef के अंदर नया ऑपरेटर प्रवर्तन नहीं कर सकता क्योंकि यह कॉफ़ीस्क्रिप्ट क्लास कीवर्ड द्वारा उत्पन्न किया जा रहा है।

उत्तर

3
बेशक

यह किया जा सकता है: बस एक और इस एक ही विषय पर प्रश्न नहीं मिला। यह एक ऐसा मामला है जहां उपयोगी साबित हुआ।

function newApply(cls, args) { 
    var argsAsString = []; 
    for (var i = 0, l = args.length; i < l; i++) { 
     argsAsString.push('args[' + i + ']'); 
    } 
    return eval('new cls(' + argsAsString.join(',') + ')'); 
} 

(another thread से चोरी)

+0

ओह कि है ... एक अच्छा बिंदु वास्तव में। हम्म, आश्चर्य है कि क्या इसमें कोई स्कोपिंग समस्या है? –

+0

स्कोपिंग एक समस्या नहीं होनी चाहिए, क्योंकि 'सीएलएस' और 'तर्क' उनके साथ अपनी दायरे की श्रृंखला लेते हैं क्योंकि उन्हें 'नया ऐपली' पास किया जाता है। – user123444555621

+0

मुझे आश्चर्य है कि क्यों (ए) आप इस उत्तर को चुनते हैं और स्वीकार किए गए किसी अन्य प्रश्न से नहीं (और), आपने इसे डुप्लिकेट के रूप में बंद करने के लिए वोट नहीं दिया? –

2

बधाई हो! आपने जावास्क्रिप्ट में सबसे उग्र गुप्त वारों में से एक पाया है और आप क्या करना चाहते हैं नहीं किया जा सकता है।

आम समाधान या तो आवरण कार्यों पैदा कर रहे हैं (जैसे तुमने किया था) या निर्माता कार्यों के पुनर्गठन सूचियों प्राप्त करने के लिए/वस्तुओं बजाय तर्क की बहुत सारी की


के लिए एक प्रस्ताव नहीं है एक "..." सद्भाव में कई तर्क (जे एस के अगले संस्करण), लेकिन तक के लिए वाक्यविन्यास फिर वहाँ तर्क के परिवर्तनशील पारित करने के लिए कोई रास्ता नहीं है एक निर्माता के लिए।

एक सूची पासिंग या वस्तु आमतौर पर एक अच्छा विचार है आप तर्क की टन है जब। यह आपको दुर्घटना से आदेश को झुकाव से बचाता है और वैकल्पिक पैरामीटर को संभालने में आसान बनाता है (जैसा कि यह आपके मामले में लगता है)।

new Foo("arg1", { 
    helpers: helpers, 
    options: optionsTemplate, 
    intruments: Assets.instruments 
}); 

संपादित करें: Use of .apply() with 'new' operator. Is this possible?

संबंधित मुद्दे