2015-09-10 11 views
13

पर गतिशील रूप से कार्यों को जोड़ने का उचित तरीका मेरे पास एक विधि exec(arg1,..,argn) के साथ एक साधारण वर्ग है और मैं कई उपनाम विधियों को रखना चाहता हूं जो exec को पूर्वनिर्धारित तर्क मानों (उदा। exec_sync = exec.bind(this, true)) के साथ कॉल करें।ES6 कक्षाओं

निम्नलिखित काम कर देता है:

class Executor { 
    constructor() { 
    this.exec_sync = this.exec.bind(this, true); 
    } 

    exec(sync, cmd, args/* ... */) { 
    // impl 
    } 
} 

लेकिन मैं अगर यह एक अच्छा विचार है या नहीं पता है कि अगर यह ES6 को मुहावरेदार है।

UDATE:

एक वास्तविक जीवन उदाहरण में मैं क्रमशः 3 और 4 छोरों, जो गतिशील रूप से वर्ग के लिए 12 उर्फ ​​तरीकों की कुल संख्या जोड़ने के लिए उपयोग किया जाता है के साथ दो नेस्टेड छोरों की है। जब आप वास्तव में जेएस का प्रोटोटाइप-आधारित प्रोग्रामिंग भाषा होने का लाभ उठा सकते हैं तो यह उपनाम विधियों को स्पष्ट रूप से परिभाषित करने के लिए एक बोझिल कार्य होगा।

अद्यतन 2 - उदाहरण:

मान लीजिए हम एक विधि request(method, body) साथ एक सरल HTTP ग्राहक है और हम उर्फ ​​तरीकों प्रदान करने के लिए GET, PUT, आदि के लिए यह निम्नलिखित कुछ ऐसा दिखाई देगा हैं:

class HTTP { 
    constructor() { 
    ['GET', 'PUT', 'POST', 'DEL'].forEach((method) => { 
     this[method] = this.request.bind(this, method); 
    }, this); 
    } 

    request(method, body) { 
    // execute the HTTP request 
    } 
} 
+0

क्यों कई कार्यों को स्पष्ट रूप से नहीं बनाते? 'exec_sync (... args) {this.exec (true, ... args) को वापस करें; } ' – zerkms

+0

@zerkms मुझे लगता है कि वर्ग स्पष्ट करता है कि यह स्पष्ट होगा। मुझे बस ऐसा कुछ करने की संभावना के बारे में दिलचस्पी थी। –

+0

ईएस 6 कक्षाएं सिर्फ वाक्य रचनात्मक चीनी हैं। रनटाइम पर ऑब्जेक्ट में गुण जोड़ने के संदर्भ में कुछ भी नहीं बदला। –

उत्तर

19

आपका समाधान है, ठीक है, हालांकि यह बेहतर हो जाएगा ये सभी पद्धतियां एक prototype स्तर पर एक बार बनाने के लिए: क्योंकि इस कोड को केवल एक बार निष्पादित किया जाता है,

['GET', 'PUT', 'POST', 'DEL'].forEach((method) => { 
    Executor.prototype[method] = function (body) { 
    return this.request(method, body) 
    } 
}) 

prototype दृष्टिकोण थोड़ा तेज है, जबकि जब भी नया इंस्टेंस बनाया जाता है तो कन्स्ट्रक्टर कोड निष्पादित किया जाता है।

prototype का एक और लाभ constructor से अधिक है कि यह वर्ग विरासत के साथ संगत है। इसलिए, यदि आप अपनी कक्षा का विस्तार करेंगे तो कुछ भी नहीं तोड़ देगा भले ही आप इनमें से किसी भी तरीके को फिर से परिभाषित करेंगे।

वैसे, आप require('http').METHODS या methods package का उपयोग यहां HTTP क्रियाओं के हार्ड-कोडेड सरणी के बजाय कर सकते हैं।

+0

धन्यवाद। http सामान एक उदाहरण होना चाहिए था, मैं इसे अपने कोड में उपयोग नहीं करता :) –

+0

हमें चलो [चैट में इस चर्चा को जारी रखें] (http://chat.stackoverflow.com/rooms/89272/discussion-between-yan -foto और लियोनिद-beschastny)। –

+0

अधिक ES5 बहुत वाह, मेरा ES6 तरीका कहां है? –

1

मैं के बारे में पता नहीं है इस किया जा रहा मुहावरेदार (क्योंकि यह बजाय प्रोग्रामिंग ही भाषा के अलावा डिजाइन के बारे में अधिक है,), लेकिन मैं व्यक्तिगत रूप से स्पष्ट कार्यों बनाने बेहतर होगा लगता है:

exec_sync(...args) { 
    return this.exec(true, ...args); 
} 
+0

वास्तविक जीवन उदाहरण में मेरे पास 2 नेस्टेड लूप हैं जो क्रमशः 3 और 4 आइटम हैं जो गतिशील रूप से कक्षा में कुल 12 आइटम जोड़ते हैं। मैन्युअल रूप से सब कुछ जोड़ने के लिए यह थोड़ा बोझिल होगा। –

+0

@ यानफोटो मैं वास्तव में इसे एक अलग वर्ग में ले जाने के बारे में सोचूंगा। – zerkms

+0

वे विधियां वास्तव में और अर्थात् कक्षा से संबंधित हैं। अगर मैं उन्हें एक अलग वर्ग में ले जाता हूं, तो मुझे अभी भी उन्हें स्पष्ट रूप से परिभाषित करने की आवश्यकता होगी। या मुझसे यहां कुछ छूट रहा है? –