ECMAScript 6 वर्गों के लिए गेटर्स और सेटर क्या हैं?


102

मैं इस बात को लेकर उलझन में हूं कि ECMAScript 6 वर्गों में गेटर्स और सेटरर्स की बात क्या है। उद्देश्य क्या है? नीचे एक उदाहरण है जिसका मैं उल्लेख कर रहा हूं:

class Employee {

    constructor(name) {
        this._name = name;
    }

    doWork() {
        return `${this._name} is working`;
    }

    get name() {
        return this._name.toUpperCase();
    }

    set name(newName){
        if(newName){ 
            this._name = newName;
        }
    }
}

1
यह सी # में उन लोगों के समान है, यदि आप इसके बारे में जानते हैं।
आर्टुरो टॉरेस सैंचेज़


अच्छा लेख जो यह बताता है कि इस पर पाया जा सकता है: coryrylan.com/blog/javascript-es6-class-syntax "ऊपर हमारी कक्षा में हमारे नाम की संपत्ति के लिए एक गेट्टर और सेटर है। हम एक बैकिंग फ़ील्ड बनाने के लिए '_' कन्वेंशन का उपयोग करते हैं। हमारी नाम संपत्ति को संग्रहीत करने के लिए। हर बार इसे प्राप्त करने या सेट करने के लिए कहा जाता है कि यह एक अतिप्रवाह का कारण बनेगा "... यह चर को वास्तव में 'निजी' नहीं होने की बात करता है, लेकिन निजी संस्करण बनाने के कई नए तरीके हैं जेएस कक्षाएं; मेरा पसंदीदा सिर्फ टाइपस्क्रिप्ट का उपयोग कर रहा है, लेकिन मैंने प्रतीक दृष्टिकोण का भी उपयोग किया है
webdvinci

जवाबों:


108

ये सेटर और गेट्टर आपको सीधे संपत्तियों का उपयोग करने की अनुमति देते हैं (बिना कोष्ठक का उपयोग किए)

var emp = new Employee("TruMan1");

if (emp.name) { 
  // uses the get method in the background
}

emp.name = "New name"; // uses the setter in the background

यह केवल संपत्ति का मूल्य निर्धारित करना और प्राप्त करना है।


1
क्या आपके पास विशेषता के बजाय संपत्ति का मतलब है? मेरे लिए बिट भ्रामक
Krizzu

अच्छी नजर, @ कृज़ु। विशेषताएँ जावास्क्रिप्ट में मौजूद हैं और गुणों की तुलना में पूरी तरह से अलग चीजें हैं। जवाब वास्तव में गुणों का उल्लेख करता है न कि विशेषताओं का। मैंने उत्तर संपादित किया है। मुझे नहीं लगता कि जवाब देने वाले को बुरा लगेगा। :)
रे तोल

मुझे यकीन नहीं है कि यह वास्तव में इस तरह का एक फायदा है, यह किसी भी तरह बसने वाले / पाने वालों की धारणा को छुपाता है। एक वर्ग का ग्राहक यह सोच सकता है कि यह सीधे संपत्तियों का उपयोग करता है, जहां यह एपोप्रीट नहीं है, लेकिन मैं मानता हूं कि यह जानकारी / विस्तार छिपने के सिद्धांत का पालन करता है। शायद अगर हम इसका उपयोग करते हैं तो यह उपयोग को आसान बना देता है और मुझे बस इसे और अधिक करने की आदत है ...
Christof Kälin

क्या आप एक सेटर में कई मापदंडों को पारित कर सकते हैं यदि आप इसका उपयोग कैसे करते हैं? @ डेविड लैब्गार
विग्नेश एस

यदि आप यहां बसने और गेटर्स बनाना चाहते हैं, तो coryrylan.com/blog/javascript-es6-class-syntax सेट से एक अच्छा उदाहरण है : set name(newName) { this._name = newName; }Get:get name() { return this._name.toUpperCase(); }
जिम डॉयल

48

ईएस 6 में गेटर्स और सेटर उसी उद्देश्य की सेवा करते हैं जो वे ईएस 5 सहित अन्य भाषाओं में करते हैं। ES5 पहले से ही गेटर्स और सेटर की अनुमति देता है Object.defineProperty, हालांकि वे कम स्वच्छ और उपयोग करने के लिए अधिक बोझिल हैं।

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

ऊपर कर्मचारी वर्ग में, इसका मतलब होगा कि आप nameइस तरह संपत्ति का उपयोग कर सकते हैं:

console.log(someEmployee.name);

यह एक सामान्य संपत्ति की तरह दिखाई देगा , लेकिन इसे toUpperCaseवापस करने से पहले यह वास्तव में नाम पर कॉल करेगा । इसी तरह, यह कर:

someEmployee.name = null;

सेटर तक पहुंच सकता है, और यह आंतरिक _nameसंपत्ति को संशोधित नहीं करेगा क्योंकि गार्ड के nameसेटर में पेश किया गया है ।

सामान्य प्रश्न यह भी देखें कि गेटर्स और सेटर का उपयोग क्यों करें? सदस्य के उपयोग की कार्यक्षमता को संशोधित करने में सक्षम होने के बारे में अधिक जानकारी के लिए उपयोगी है।


3

ES6 गेटर्स और सेटर्स की जावा में समान अवधारणाओं की तुलना में काफी अलग प्रेरणा है।

जावा में, गेटर्स और सेटर एक वर्ग को जावाबीन को परिभाषित करने की अनुमति देते हैं। गेटर्स और सेटर की बात यह है कि यह बीन को सार्वजनिक क्षेत्रों से निहित पूरी तरह से ऑर्थोगोनल "इंटरफ़ेस" की अनुमति देता है। तो मेरे पास एक फ़ील्ड "नाम" हो सकता है जो कि एक JavaBean प्रॉपर्टी नहीं है, और मेरे पास एक JavaBean प्रॉपर्टी "पता" हो सकता है जो एक फ़ील्ड नहीं है।

जावा प्रतिबिंब के माध्यम से जावा के गुण हजारों चौखटे (उदाहरण के लिए हाइबरनेट) द्वारा "खोजे जाने योग्य" भी हैं। इस प्रकार, गेटर्स और सेटर बीन गुणों को "उजागर" करने के लिए एक मानक विधि का हिस्सा हैं।

गेटर्स और सेटर, फ़ंक्शंस होने के कारण, यह भी मूल्य है कि वे कार्यान्वयन को "अमूर्त" करते हैं। यह एक क्षेत्र या एक गणना ("सिंथेटिक") मूल्य ग्रहण कर सकता है। इसलिए अगर मेरे पास "zipcode" नामक सेम संपत्ति है, जो संग्रहीत स्ट्रिंग के रूप में शुरू होती है। अब मान लें कि मैं इसे पते / शहर / राज्य से गणना मूल्य में बदलना चाहता हूं?

यदि मैं किसी फ़ील्ड का उपयोग करता हूं, तो यह कोड टूट जाता है:

      String zipcode = address.zipcode();

लेकिन अगर मैं एक गटर का उपयोग करता हूं, तो यह नहीं टूटता:

      String zipcode = address.getZipcode();

जावास्क्रिप्ट में JavaBeans जैसा कुछ भी नहीं है। अब तक मैंने पढ़ा है, GET और SET का इच्छित मूल्य "सिंथेटिक" (गणना) गुणों के लिए सीमित है।

लेकिन यह जावा की तुलना में कुछ हद तक बेहतर है, जबकि जावा आपको "फ़ील्ड" को एक विधि में परिवर्तित करने की अनुमति नहीं देता है, ES6 GET और SET इसकी अनुमति देता है।

यही कारण है, अगर मेरे पास है:

       var zipcode = address.zipcode;

यदि मैं एक ऑब्जेक्ट को एक मानक ऑब्जेक्ट प्रॉपर्टी से एक गटर में बदल देता हूं, तो उपरोक्त कोड अब GET फ़ंक्शन को कॉल करता है।

ध्यान दें कि अगर मैंने परिभाषा में GET को शामिल नहीं किया है, तो यह zipcode GET विधि को लागू नहीं करेगा। इसके बजाय, यह केवल फ़ंक्शन zipcode को var को असाइन करेगा।

इसलिए मुझे लगता है कि बेटवे जावा और जावास्क्रिप्ट ईएस 6 गेटर्स और सेटर्स को समझने के लिए ये कुछ महत्वपूर्ण अंतर हैं।


0
class Employee {

    constructor(name) {
      this._name = name;
    }

    doWork() {
      return `${this._name} is working`;
    }

    get name() {
      // when you get this by employeeInstance.mame
      // the code below will be triggered
      // and you can do some logic here
      // just like `console.log` something you want
      console.log('get triggered!')
      return this._name.toUpperCase();
    }

    set name(newName) {
      // the same as `get`
      // when you employeeInstance.mame = 'xxx'
      // the code blew will be trigged
      // and you can also do some logic 
      // like here is a `console.log` and `if check`
      console.log('set triggered!')
      if (newName) {
        this._name = newName;
      }
    }
  }

  const employeeInstance = new Employee('mike')
  employeeInstance.name
  employeeInstance.name = '' // this won't be success, because the `if check`
  console.log(employeeInstance.name)

  // => 
  // get triggered
  // set triggered
  // get triggered
  // MIKE

वैसे भी getterऔर setterबस एक जासूस की तरह है। यह किसी वस्तु की संपत्ति की जासूसी करता है, ताकि आप कुछ कर सकें, हर बार जब आप संपत्ति के मूल्य को प्राप्त करते हैं या सेट करते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.