2015-01-29 8 views
76

मैं उलझन में हूं कि गेटर्स और सेटर्स का बिंदु ईसीएमएस्क्रिप्ट 6 कक्षाओं में क्या है। उद्देश्य क्या है? नीचे एक उदाहरण मैं की बात कर रहा हूं:ईसीएमएस्क्रिप्ट 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; 
     } 
    } 
} 
+0

यह सी # में समान है, अगर आपको इसके बारे में पता चल जाता है। –

+0

संबंधित: [GetProperty/setProperty सम्मेलन पर ES6 गेटर्स और सेटर्स का उपयोग करने के लिए तर्क क्या है?] (Http://stackoverflow.com/q/32114468/1048572) – Bergi

+0

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

उत्तर

83

ये सेटर और गेटर आप गुण सीधे (कोष्ठक का उपयोग किए बिना)

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

+0

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

+0

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

36

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

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

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

console.log(someEmployee.name); 

यह एक सामान्य संपत्ति पहुँच की तरह विचार करेंगे, लेकिन यह वास्तव में से पहले नाम पर toUpperCase कहेंगे इसे वापस कर रहा है इसी तरह, यह कर:

someEmployee.name = null; 

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

सदस्य पहुंच की कार्यक्षमता को संशोधित करने में सक्षम होने के बारे में अधिक जानकारी के लिए सामान्य प्रश्न Why use getters and setters? सामान्य प्रश्न भी देखें।

+0

बहुत स्पष्ट स्पष्टीकरण। धन्यवाद! –

0

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

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

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

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

अगर मैं एक क्षेत्र का उपयोग करें, इस कोड टूट जाता है:

 String zipcode = address.zipcode(); 

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

 String zipcode = address.getZipcode(); 

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

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

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

 var zipcode = address.zipcode; 

अगर मैं एक गेटर करने के लिए एक मानक वस्तु संपत्ति होने से ज़िपकोड बदलने के लिए, ऊपर कोड अब प्राप्त फ़ंक्शन को कॉल।

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

तो मुझे लगता है कि यह betweeen जावा और जावास्क्रिप्ट ES6 गेटर्स और सेटर्स को समझने के लिए कुछ महत्वपूर्ण भेद हैं।

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