जावास्क्रिप्ट में गेटर्स और सेटर्स
अवलोकन
Getters और जावास्क्रिप्ट में setters परिभाषित करने के लिए उपयोग किया जाता है अभिकलन गुण , या accessors । एक गणना की गई संपत्ति वह है जो एक वस्तु मूल्य प्राप्त करने या निर्धारित करने के लिए एक फ़ंक्शन का उपयोग करती है। मूल सिद्धांत कुछ इस तरह कर रहा है:
var user = { /* ... object with getters and setters ... */ };
user.phone = '+1 (123) 456-7890'; // updates a database
console.log( user.areaCode ); // displays '123'
console.log( user.area ); // displays 'Anytown, USA'
यह किसी संपत्ति तक पहुंचने के बाद स्वचालित रूप से चीजों को करने के लिए उपयोगी होता है, जैसे कि किसी संपत्ति को एक्सेस करना, जैसे नंबरों को सीमा में रखना, तारों को सुधारना, मूल्य-परिवर्तनित घटनाओं को ट्रिगर करना, रिलेशनल डेटा को अपडेट करना, निजी संपत्तियों तक पहुंच प्रदान करना, और बहुत कुछ।
नीचे दिए गए उदाहरण मूल सिंटैक्स दिखाते हैं, हालांकि वे बस कुछ विशेष किए बिना आंतरिक वस्तु मूल्य प्राप्त करते हैं और सेट करते हैं। वास्तविक दुनिया के मामलों में आप अपनी आवश्यकताओं के अनुरूप इनपुट और / या आउटपुट मूल्य को संशोधित करेंगे, जैसा कि ऊपर उल्लेख किया गया है।
कीवर्ड प्राप्त करें / सेट करें
ECMAScript 5 संपत्तियों को परिभाषित करने के लिए समर्थन get
और set
कीवर्ड देता है। वे IE 8 और नीचे को छोड़कर सभी आधुनिक ब्राउज़रों के साथ काम करते हैं।
var foo = {
bar : 123,
get bar(){ return bar; },
set bar( value ){ this.bar = value; }
};
foo.bar = 456;
var gaz = foo.bar;
कस्टम गेटर्स और सेटर्स
get
और set
आरक्षित शब्द नहीं हैं, इसलिए वे आपके स्वयं के कस्टम, क्रॉस-ब्राउज़र कंप्यूटेड संपत्ति कार्यों को बनाने के लिए अतिभारित हो सकते हैं। यह किसी भी ब्राउज़र में काम करेगा।
var foo = {
_bar : 123,
get : function( name ){ return this[ '_' + name ]; },
set : function( name, value ){ this[ '_' + name ] = value; }
};
foo.set( 'bar', 456 );
var gaz = foo.get( 'bar' );
या अधिक कॉम्पैक्ट दृष्टिकोण के लिए, एक एकल फ़ंक्शन का उपयोग किया जा सकता है।
var foo = {
_bar : 123,
value : function( name /*, value */ ){
if( arguments.length < 2 ){ return this[ '_' + name ]; }
this[ '_' + name ] = value;
}
};
foo.value( 'bar', 456 );
var gaz = foo.value( 'bar' );
ऐसा कुछ करने से बचें, जिससे कोड ब्लोट हो सकता है।
var foo = {
_a : 123, _b : 456, _c : 789,
getA : function(){ return this._a; },
getB : ..., getC : ..., setA : ..., setB : ..., setC : ...
};
उपर्युक्त उदाहरणों के लिए, आंतरिक संपत्ति के नाम एक अंडरस्कोर के साथ सारगर्भित हैं, ताकि उपयोगकर्ताओं को बस करने और foo.bar
बनाम foo.get( 'bar' )
"अनकूक" मान प्राप्त करने से हतोत्साहित किया जा सके । आप प्रॉपर्टी के नाम ( name
पैरामीटर के माध्यम से ) तक पहुंच के आधार पर विभिन्न चीजों को करने के लिए सशर्त कोड का उपयोग कर सकते हैं ।
Object.defineProperty ()
का उपयोग करना Object.defineProperty()
गेटर्स और सेटर को जोड़ने का एक और तरीका है, और उन्हें परिभाषित किए जाने के बाद वस्तुओं पर उपयोग किया जा सकता है। इसका उपयोग विन्यास योग्य और गणना करने योग्य व्यवहारों को सेट करने के लिए भी किया जा सकता है। यह सिंटैक्स IE 8 के साथ भी काम करता है, लेकिन दुर्भाग्य से केवल DOM ऑब्जेक्ट्स पर।
var foo = { _bar : 123 };
Object.defineProperty( foo, 'bar', {
get : function(){ return this._bar; },
set : function( value ){ this._bar = value; }
} );
foo.bar = 456;
var gaz = foo.bar;
__defineGetter __ ()
अंत में, __defineGetter__()
एक और विकल्प है। यह पदावनत है, लेकिन अभी भी वेब के चारों ओर व्यापक रूप से उपयोग किया जाता है और इस तरह जल्द ही कभी भी गायब होने की संभावना नहीं है। यह IE 10 और उसके नीचे के सभी ब्राउज़रों पर काम करता है। हालांकि अन्य विकल्प भी गैर-IE पर अच्छी तरह से काम करते हैं, इसलिए यह उपयोगी नहीं है।
var foo = { _bar : 123; }
foo.__defineGetter__( 'bar', function(){ return this._bar; } );
foo.__defineSetter__( 'bar', function( value ){ this._bar = value; } );
इसके अलावा ध्यान देने योग्य है कि बाद के उदाहरण में, आंतरिक नामों से बचने के प्रत्यावर्तन के लिए एक्सेसर नाम (यानी, से भिन्न होना चाहिए है foo.bar
बुला foo.get(bar)
बुला foo.bar
बुला foo.get(bar)
...)।
यह सभी देखें
MDN प्राप्त , सेट ,
Object.defineProperty () , __defineGetter __ () , __defineSetter __ ()
MSDN
IE8 मनुष्य समर्थन