तीर फ़ंक्शन के साथ ES6 गेट्टर / सेटर


100

मैं babel6 का उपयोग कर रहा हूं और अपने पालतू प्रोजेक्ट के लिए मैं XMLHttpRequest के लिए एक रैपर बना रहा हूं, उन तरीकों के लिए जो मैं उपयोग कर सकता हूं:

open = (method, url, something) => {
  return this.xhr.open(method, url, something);
}

लेकिन गुण तीर फ़ंक्शन के लिए काम नहीं करता है

यह काम:

get status() { return this.xhr.status; }

लेकिन मैं उपयोग नहीं कर सकता

get status = () => this.xhr.status;

क्या यह जानबूझकर है?


आपको घुंघराले कोष्ठक या वापसी की आवश्यकता नहीं है; आप बस कह सकते हैं (method, url, something) => this.xhr.open(method. url, something)

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

1
status => this.xhr.status(c # 7 सिंटैक्स) या संभवत: get status() => this.xhr.statusपठनीयता के लिए वास्तव में एक बेहतरीन सिंटेक्सिक शुगर रहा होगा, लेकिन जावास्क्रिप्ट टाइप टाइपस्क्रिप्ट नहीं है (अभी तक?) इसका समर्थन नहीं करता
चार्ल्स हेइटियर

जवाबों:


108

ES2015 व्याकरण के अनुसार, एक वस्तु शाब्दिक पर एक संपत्ति केवल चार चीजों में से एक हो सकती है:

संपत्ति :

  • IdentifierReference
  • संपत्तिनाम : असाइनमेंट
  • MethodDefinition

इन प्रकारों में से केवल एक जो अग्रणी की अनुमति देता getहै वह है MethodDefinition :

MethodDefinition :

  • PropertyName ( StrictFormalParameters ) { FunctionBody }
  • GeneratorMethod
  • get प्रॉपर्टीनेम ( ) { फंक्शनबॉडी }
  • set प्रॉपर्टीनेम ( PropertySetParameterList ) { FunctionBody }

जैसा कि आप देख सकते हैं, getफॉर्म बहुत सीमित व्याकरण का अनुसरण करता है जो कि फॉर्म का होना चाहिए

get NAME () { BODY }

व्याकरण प्रपत्र के कार्यों की अनुमति नहीं देता है get NAME = ...


आपकी मदद के लिए धन्यवाद, मैं आपका जवाब स्वीकार करता हूं। क्या आप जानते हैं कि यह कहाँ परिभाषित है कि गेटटर / सेटर का उपयोग असाइनमेंट के साथ नहीं किया जा सकता है? बस उत्सुक।
गबरो गुड़िया

@GaborDolla ने ECMAScript युक्ति में वस्तु शाब्दिक व्याकरण का उल्लेख किया।
अप्सिलर्स

35

स्वीकृत उत्तर महान है। यदि आप कॉम्पैक्ट "तीर फ़ंक्शन सिंटैक्स" के बजाय सामान्य फ़ंक्शन सिंटैक्स का उपयोग करना चाहते हैं तो यह सबसे अच्छा है

लेकिन शायद आप वास्तव में तीर के कार्यों को पसंद करते हैं; हो सकता है कि आप किसी अन्य फ़ंक्शन के लिए तीर फ़ंक्शन का उपयोग करते हैं जो एक सामान्य फ़ंक्शन सिंटैक्स को प्रतिस्थापित नहीं कर सकता है ; आपको एक अलग समाधान की आवश्यकता हो सकती है।

उदाहरण के लिए, मैं ओपी उपयोगों को नोटिस करता हूं this, आप लेक्सिकली बांधनाthis चाह सकते हैं ; उर्फ "इस के गैर-बाध्यकारी" ), और तीर के कार्य उस शाब्दिक बंधन के लिए अच्छे हैं।

आप अभी भी Object.definePropertyतकनीक के माध्यम से एक गेटर के साथ एक तीर फ़ंक्शन का उपयोग कर सकते हैं ।

{
  ...
  Object.defineProperty(your_obj, 'status', { 
     get : () => this.xhr.status 
  });
  ...
}

देखें का उल्लेख object initializationतकनीक (उर्फ get NAME() {...}) बनाम definePropertyतकनीक (उर्फ get : ()=>{}) । कम से कम एक महत्वपूर्ण अंतर है, definePropertyपहले से मौजूद चर की आवश्यकता होती है:

मौजूदा वस्तुओं पर एक गटर को परिभाषित करना

यानी आपके साथ Object.definePropertyयह सुनिश्चित करना चाहिए कि your_obj(मेरे उदाहरण में) मौजूद है और एक चर में सहेजा गया है (जबकि आपके साथ object-initializationआप ऑब्जेक्ट-शाब्दिक रूप से अपने ऑब्जेक्ट इनिशियलाइज़ेशन में लौट सकते हैं:) {..., get(){ }, ... }विशेष रूप से यहाँ पर अधिक जानकारीObject.defineProperty

Object.defineProperty(...)लगता है get NAME(){...}वाक्यविन्यास के लिए तुलनीय ब्राउज़र समर्थन है ; आधुनिक ब्राउज़र, IE 9।


10
चतुर, लेकिन यह अंततः सिर्फ की तुलना में बहुत अधिक get status() { return this.xhr.status; }
क्रिया है

2
@ देवदूत मैं मानता हूं कि यह बहुत ही वाचाल है। लेकिन सिर्फ स्पष्ट होने के लिए, आपकी वह वस्तु this होनी चाहिए जिसमें आपकी get status() { ... }परिभाषा है। लेकिन लेक्सिकल बाइंडिंग अंतर के कारण मेरा कुछ और this हो सकता है, है ना?
लाल मटर

2
सहमत ... हालांकि व्यवहार में, मैं एक ऐसे मामले में नहीं चला हूं, जहां thisमुझे एक्सेस करने वाला नहीं चाहिए। ( thisईवेंट फ़ंक्शंस और कॉलबैक के साथ, जब फ़ंक्शंस पास हो रहे हैं, तो एरो फ़ंक्शंस के बाइंडिंग फ़ायदों को खेलने में लगता है।)
devuxer

3
मैं सहमत हूं, मैं अक्सर ()=>{}कॉलबैक के लिए फैट एरो + लेक्सिकल बाइंडिंग का उपयोग करता हूं, जो मैं एक प्रॉमिस को पास करता हूं , जैसे $http(...).then((promise_result)=> this...}))। यदि मैं वसा-तीर का उपयोग नहीं करता हूं, thisतो वैश्विक Windowवस्तु का प्रतिनिधित्व करेगा ; बहुत उपयोगी नहीं है। लेकिन मैंने शायद ही कभी (कभी भी?) का इस्तेमाल ()=>{}"गेट एक्सेसर" के लिए फ़ंक्शन के रूप में किया हो जैसा कि आप कहते हैं ... कम से कम thisअंदर की get()वस्तु उस वस्तु का प्रतिनिधित्व करेगी जिस get()पर परिभाषित किया गया है (जो पहले से अधिक उपयोगी है Window; इसलिए उपयोग करने की कोई आवश्यकता नहीं है; एक मोटा-तीर समारोह!)
लाल मटर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.