2016-12-13 5 views
5

मैं ES6 कक्षाओं पसंद है, लेकिन मैं नहीं समझ सकता क्यों मैं इस तरह कंस्ट्रक्टर्स में तरीकों के लिए बाध्य करने के लिए क्या:ईएस 6 में कक्षा के साथ बनाए गए ऑब्जेक्ट की विधियां क्यों नहीं हैं?

constructor() { 
    this.someMethod = this.someMethod.bind(this) 
} 

मैं लगभग किसी भी विधि के लिए कर की जरूरत है।

क्या यह वास्तविक सीमा है या क्या मुझे कुछ याद आ रही है? इसके पीछे का कारण क्या है? मुझे पता है कि जेएस में कक्षाएं केवल वाक्य रचनात्मक चीनी हैं लेकिन यह उनका हिस्सा हो सकती थी।

+0

ऐसा इसलिए है क्योंकि आप संदर्भ को बदलने वाले अन्य कार्यों के कार्यों को पारित कर रहे हैं। जैसे घटना हैंडलर। तीर फ़ंक्शंस से निपटने में आसान बनाता है: 'foo.on (' poop ', e => this.someMethod (e)) ' –

+4

https://esdiscuss.org/topic/why-are-es6-class-methods- स्वचालित रूप से बाध्य करने के लिए उदाहरण – Gerrit0

+0

यह है कि यह 'जेएस जेएस (-फंक्शन) में कैसे काम करता है, और कण में कक्षाओं के साथ कुछ भी नहीं है। और यह भी कारण/तरीका है कि प्रोटोटाइप विरासत जेएस में काम करता है। जेएस जावा के रूप में कठोर नहीं है। शायद आप गलत निर्माण का उपयोग कर रहे हैं? शायद एक बेहतर दृष्टिकोण है? – Thomas

उत्तर

4

the linked esdiscuss post यहाँ करने के लिए मार्क मिलर के जवाब का हवाला देते हुए:

जल्दी वर्ग प्रस्तावों की

कई ने वैसा ही किया, जैसा कि वे रचनाओं के- instance- रूप es5 वस्तुओं के रूप में बंद है और कक्षाओं के शब्दों के साथ शुरू किया गया था लक्षण।

doku.php?do=search&id=traits

विचार है कि भाषा समर्थन इस अर्थ विज्ञान कुशल बनाना होगा, बेसब्री से उदाहरण प्रति विधि के अनुसार एक बंद आवंटित करने के लिए जरूरत से परहेज था।

हालांकि, कारणों से मैं समझता हूं, ये कर्षण प्राप्त करने में विफल रहे। इसके बजाए, हम प्रोटोटाइप विरासत में एन्कोडिंग कक्षाओं के प्रमुख एएस 5 पैटर्न के लिए चीनी की ओर बढ़ते हैं। प्रारंभ में, हमने इसे पूरी तरह से चीनी होने की कोशिश की, ताकि लोग कक्षाओं में उस प्रमुख पैटर्न में दर्द रहित ढंग से कोड को दोबारा कर सकें।

जैसा कि हम सुपर और निर्माण के आसपास विस्तृत अर्थशास्त्र के साथ कुश्ती करते हैं, ईएस 6 कक्षाएं शुद्ध चीनी होने से विचलित होती हैं। लेकिन यह विचलन केवल es6 वर्गों से प्रभावशाली es5 पैटर्न में दर्द रहित रिफैक्टरिंग को रोकता है। व्यावहारिक रूप से, यह ईएस 5 पैटर्न से एएस 6 कक्षाओं में प्रतिक्रिया करने के लिए दर्द रहित रहता है। decreeing कि तरीकों accessors जिसका गेटर बांध के रूप में प्रोटोटाइप पर स्थापित कर रहे हैं द्वारा व्यवहार के लेखांकन -

zenparsing/es-function-bind#17 हम

हम अभी भी तरीकों निकासी पर बाध्य किया था हो सकता था एहसास हुआ। हालांकि, यह अहसास es6 के लिए बहुत देर हो गई। चूंकि यह कक्षाओं में अधिक खतरनाक रूप से पुनर्विक्रय कर सकता था - एक अर्थपूर्ण परिवर्तन के अधिक - यह स्पष्ट नहीं है कि अगर हम समय पर इसके बारे में सोचते हैं तो यह उड़ जाएगा। इसके बजाय, सजावटी डिजाइनों की सभी भिन्नताओं के तहत, कोई ऐसे सजावटी को लिख सकता है ताकि स्पष्ट रूप से इस एक्सेसर संपत्ति को बनाकर सजाए गए तरीकों को बाध्य-पर-निष्कर्षण दिया जा सके। हालांकि (!), यदि उपयोगकर्ता-भूमि सजावट के रूप में लागू किया गया है, तो वस्तुओं के बंद होने की तुलना में इसका बहुत खराब प्रदर्शन है !! ऑब्जेक्ट आवंटित करते समय ऑब्जेक्ट्स-ए-क्लोजर में आवंटन लागत अधिक होती है।

jsperf.com/creating-stateful-objects

लेकिन वस्तु का उपयोग कर एक बार वस्तु बनाई गई है में बहुत प्रभावी होती हैं:।

jsperf.com/strict-where-state

(ध्यान दें कि jsperf क्रोम 46.0.2486 के रूप में एज 28.14257.1000.0 misidentifying है यह वह जगह है ध्यान देने योग्य है क्योंकि एज वीकमैप्स के लिए ट्रांसपोज़ेड प्रस्तुति का उपयोग करता है, और इसलिए निजी राज्य के वीकैप-आधारित उपयोग एज पर बहुत कम जुर्माना है। हालांकि यह इस धागे के बिंदु के अलावा है।)

बाइंडिंग-ऑन-निष्कर्षण कुशल के लिए एक सजावटी बनाने के लिए, कार्यान्वयन को तुरंत निकालने के बजाए विधि को तुरंत लागू होने पर आवंटन से बचने के लिए किसी प्रकार के विशेष मामले की आवश्यकता होगी।इसे सक्षम करने के लिए टीसी 3 9 की एकमात्र चीज ऐसी सजावट को मानकीकृत करने की आवश्यकता है ताकि कार्यान्वयन इसे एक बिल्टिन के रूप में प्रदान कर सके जो वे पहचानते हैं।

और केविन स्मिथ के जवाब:

सामान्य में, वहाँ अक्सर भाषा बनाने "बेहतर" (कुछ व्यक्तिपरक मूल्य प्रणाली के लिए) और निरंतरता को बनाए रखने के बीच एक तनाव है। मुझे लगता है कि स्थिरता बनाए रखना इस मामले में सही कॉल था।


जिसके अनुसार, public class fieldsproposal (बजाय constructor में एक ही करने का) आप

class Foo { 
    someMethod =() => { 
    // do stuff 
    } 
} 

के रूप में उदाहरण के तरीकों को परिभाषित करने की अनुमति देगा।

+0

@ बर्गि: बेशक। लेकिन यह इस उपयोग के मामले के लिए वाक्य रचनात्मक चीनी है। –

+0

क्या हमें सामान बंद करना चाहिए [क्यों एक विधि संदर्भ इसका ट्रैक नहीं रखता है?] (Http://stackoverflow.com/q/35050878/1048572) इस के एक डुप्ली के रूप में? साथ ही, मैं कसम खाता हूं कि ईएस 5- प्रोटोटाइप विधियों को निष्कर्षण पर क्यों बाध्य नहीं किया जा सकता है, जो कि लिंक करने के लिए मूल्यवान हो सकता है लेकिन मुझे यह नहीं मिल रहा है। – Bergi

+0

क्या मार्क मिलर ने कहा कि क्या कोई और व्यावहारिक रूप से फिर से शुरू कर सकता है? – marco

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