डमीज़ के लिए गेटर्स \ सेटर


133

मैं अपने सिर को पाने के लिए कोशिश कर रहा हूँ और इसके आसपास बसने और इसके डूबने की कोशिश नहीं कर रहा हूँ। मैंने जावास्क्रिप्ट गेटर्स एंड सेटर्स और डिफाइनिंग गेटर्स एंड सेटर्स को पढ़ा है और बस नहीं मिल रहा है।

क्या कोई स्पष्ट रूप से बता सकता है:

  1. एक गेटटर और सेटर क्या करने के लिए हैं, और
  2. कुछ बहुत आसान उदाहरण दें?

12
व्यक्तिगत रूप से, मुझे नहीं पता कि आप जॉन की तुलना में एक स्पष्ट व्याख्या कैसे प्राप्त कर सकते हैं ...
जेसन बंटिंग

OO दुनिया में, गेट्टर और सेटर मदद करता है कि एक वर्ग है कि ठीक से समझाया है
overexchange

मूल रूप से मैं इसे इस तरह से देखता हूं: आप संपत्ति प्राप्त करने और स्थापित करने के लिए अधिभार को परिभाषित कर रहे हैं, और ये अधिभार कार्य हैं; लेकिन, आपको उन्हें कॉल करने की आवश्यकता नहीं है। इस तरह से आप के a = setValue(5);साथ प्रतिस्थापित कर सकते हैं a = 5;और इस तरह से आप setValue()जो कुछ भी करना चाहते हैं उसे हुड के नीचे बुलाया जाएगा।
एंड्रयू

जवाबों:


102

@ मिलीमो के जवाब के अलावा , अन्य मूल्यों को अपडेट करने के लिए बसने का भी उपयोग किया जा सकता है।

function Name(first, last) {
    this.first = first;
    this.last = last;
}

Name.prototype = {
    get fullName() {
        return this.first + " " + this.last;
    },

    set fullName(name) {
        var names = name.split(" ");
        this.first = names[0];
        this.last = names[1];
    }
};

अब, आप सेट कर सकते हैं fullName, और firstऔर lastअद्यतन और इसके विपरीत हो जाएगा।

n = new Name('Claude', 'Monet')
n.first # "Claude"
n.last # "Monet"
n.fullName # "Claude Monet"
n.fullName = "Gustav Klimt"
n.first # "Gustav"
n.last # "Klimt"

2
@ आकाश: नहीं, हालांकि, इंटरनेट एक्सप्लोरर 9 नए Object.definePropertyफ़ंक्शन का समर्थन करता है जो गेटर्स और सेटर्स को परिभाषित कर सकता है।
मैथ्यू क्रुमले

9
यह वास्तव में दर्दनाक नहीं है कि एमएस जेएस को सही ढंग से समर्थन नहीं करता है और वे अपनी चांदी की रोशनी को हर जगह नहीं चलाते हैं, इसलिए मुझे दो बार सब कुछ प्रोग्राम करना होगा, एक एसएल के लिए और दूसरा दुनिया के लिए :)
आकाश काव

2
@ मर्टिन: आप जॉन के जवाब में उसी तकनीक का उपयोग करके उन्हें निजी बना सकते हैं । यदि आप असली गेटर्स / सेटर का उपयोग करना चाहते हैं, तो आपको this.__defineGetter__नए Object.definePropertyफ़ंक्शन का उपयोग करना होगा ।
मैथ्यू क्रुमले

1
ऊपर सूचीबद्ध दृष्टिकोण के साथ केवल एक समस्या है, यदि आप पहले से मौजूद वर्ग के लिए गेटर्स और सेटर जोड़ना चाहते हैं तो यह प्रोटोटाइप को ओवरराइड कर देगा, और मूल तरीके सुलभ नहीं होंगे।
xchg.ca

1
क्या यह दृष्टिकोण अधिलेखित नहीं है Name.prototype.constructor? मिलीमोज़ के उत्तर के लिए एक बुरा विकल्प की तरह लगता है ।
r0estir0bbe

62

जावास्क्रिप्ट में गेटर्स और सेटर्स

अवलोकन

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 मनुष्य समर्थन


1
में अधिक कॉम्पैक्ट दृष्टिकोण , this[ '_' + name ] = value;हो सकता है this[ '_' + name ] = arguments[1];और निर्दिष्ट करने के लिए कोई जरूरत नहीं होगी valueआर्ग।
रेडहार्ट

1
उदाहरण: var foo = { bar : 123, get bar(){ return bar; }, set bar( value ){ this.bar = value; } }; foo.bar = 456; एक अपवाद को उठाता है: अनक्रेन्डेड रेंज: अधिकतम कॉल स्टैक का आकार Object.set बार [बार के रूप में] से अधिक होता है (<अनाम>: 4: 32) Object.set बार में [बार के रूप में] (<अनाम>: 4: 32 ) Object.set बार [बार के रूप में] (<अनाम>: 4: 32) Object.set बार में [बार के रूप में] (<अनाम>: 4: 32) Object.set बार में [बार के रूप में] (<अनाम> : 4: 32) Object.set बार में [बार के रूप में] (<अनाम>: 4: 32)
nevf

1
सेट / प्राप्त नाम प्रॉपर्टी के नाम से भिन्न होना चाहिए। इसलिए इसके बजाय bar: 123और उदाहरण के लिए this.bar = valueइन्हें बदलें _bar । देखें: hongkiat.com/blog/getters-setters-javascript
nevf

@nevf सुधार के लिए धन्यवाद! हां, आमतौर पर गणना किए गए गुणों के साथ "वास्तविक" आंतरिक एक का नाम होता है जैसे _fooया mFoo। यदि यह गेटटर / सेटर के समान है, तो यह पुनरावृत्ति के कारण एक अनंत लूप का कारण होगा और फिर एक St Over Overflow ™ ;-) क्योंकि जब आप a = b कहते हैं, तो यह a.get (b) कहता है जो स्वयं को a = b कहता है , जो a.get (b) कहता है, ...
Beejor 15

58

आप उन्हें उदाहरण के लिए गणना की गई संपत्तियों को लागू करने के लिए उपयोग करेंगे।

उदाहरण के लिए:

function Circle(radius) {
    this.radius = radius;
}

Object.defineProperty(Circle.prototype, 'circumference', {
    get: function() { return 2*Math.PI*this.radius; }
});

Object.defineProperty(Circle.prototype, 'area', {
    get: function() { return Math.PI*this.radius*this.radius; }
});

c = new Circle(10);
console.log(c.area); // Should output 314.159
console.log(c.circumference); // Should output 62.832

(CodePen)


ठीक है, मुझे लगता है कि मैं इसे प्राप्त करना शुरू कर रहा हूं। मैं किसी ऐरे ऑब्जेक्ट की लंबाई संपत्ति के लिए एक नियोजक को सौंपने की कोशिश कर रहा हूं, लेकिन एक त्रुटि हो रही है: "var लंबाई का पुनर्वितरण" और कोड इस तरह दिखता है: obj = []; obj .__ डिफिगरेटर __ ('लेंथ', फंक्शन () {रिटर्न दिस.लॉन्ग;});

1
ऐसा इसलिए है क्योंकि Array ऑब्जेक्ट्स में पहले से ही एक अंतर्निहित लंबाई गुण होता है। यदि पुनर्वितरण की अनुमति दी गई थी, तो नई लंबाई को कॉल करने से असीम पुनरावृत्ति होगी। संपत्ति को "my_length" या कुछ इस तरह से कॉल करने का प्रयास करें।
मिलीमोसे

एक कथन में दोनों गेटर्स को परिभाषित करने के लिए, उपयोग करें Object.defineProperties
r0estir0bbe

क्या आप केवल {"क्षेत्र": फ़ंक्शन () {वापसी ...}} नहीं कर सकते? बस इसे एक ऑब्जेक्ट प्रॉपर्टी के रूप में असाइन करें
RegarBoy

@developer यह एक जावास्क्रिप्ट गेट्टर नहीं है जैसा कि भाषा द्वारा परिभाषित किया गया है, यह केवल एक फ़ंक्शन है। आपको इसे मूल्य प्राप्त करने के लिए कॉल करना होगा, यह संपत्ति तक पहुंच को अधिभार नहीं देता है। इसके अलावा उन लोगों के लिए नरक का एक विशेष घेरा है जो जेएस में अपने स्वयं के टूटे हुए ऑब्जेक्ट सिस्टम का आविष्कार करते हैं, जो पहले से ही उसके पास है।
मिलिमोस जूल

16

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

गेटर:

var settings = {
    firstname: 'John',
    lastname: 'Smith',
    get fullname() { return this.firstname + ' ' + this.lastname; }
};

console.log(settings.fullname);

... लॉग इन करेंगे John Smith, अवश्य। एक गेट्टर एक चर ऑब्जेक्ट प्रॉपर्टी की तरह व्यवहार करता है, लेकिन एक फ़ंक्शन के लचीलेपन को मक्खी पर उसके लौटा मूल्य की गणना करने के लिए प्रदान करता है। यह मूल रूप से एक फ़ंक्शन बनाने के लिए एक फैंसी तरीका है जिसे कॉल करते समय () की आवश्यकता नहीं होती है।

सेटर:

var address = {
    set raw(what) {
        var loc = what.split(/\s*;\s*/),
        area = loc[1].split(/,?\s+(\w{2})\s+(?=\d{5})/);

        this.street = loc[0];
        this.city = area[0];
        this.state = area[1];
        this.zip = area[2];
    }
};

address.raw = '123 Lexington Ave; New York NY  10001';
console.log(address.city);

... New Yorkकंसोल पर लॉग इन करेंगे । गेटर्स की तरह, बसने वालों को ऑब्जेक्ट गुण के मान को सेट करने के समान सिंटैक्स के साथ कहा जाता है, लेकिन बिना फ़ंक्शन () के कॉल करने के लिए अभी तक एक और फैंसी तरीका है।

देखें इस jsfiddle अधिक विस्तृत रूप से, शायद अधिक व्यावहारिक उदाहरण के लिए। ऑब्जेक्ट के सेटर में मानों को पास करना अन्य ऑब्जेक्ट आइटमों के निर्माण या जनसंख्या को ट्रिगर करता है। विशेष रूप से, jsfiddle उदाहरण में, संख्याओं की एक सरणी सेटर को माध्य, माध्य, मोड और श्रेणी की गणना करने के लिए संकेत देता है; फिर प्रत्येक परिणाम के लिए ऑब्जेक्ट गुण सेट करता है।


मैं अभी भी एक गेटमैथोड या सेटमैथोड बनाने बनाम सेट और उपयोग करने के लाभ को नहीं समझता हूं। क्या एकमात्र लाभ यह है कि आप इसे बिना () कह सकते हैं? एक और कारण होना चाहिए कि इसे जावास्क्रिप्ट में जोड़ा जाए।
एंड्रियास

@Andreas गेटर्स और सेटर्स गुणों का व्यवहार करते हैं जब कहा जाता है, जो उनके इच्छित उद्देश्य को स्पष्ट करने में मदद कर सकता है। वे अन्यथा लापता क्षमताओं को अनलॉक नहीं करते हैं, लेकिन उनका उपयोग आपको अपने विचारों को व्यवस्थित करने में मदद कर सकता है। यही वास्तविक लाभ है। एक व्यावहारिक उदाहरण के रूप में, मैंने Google मैप्स ऑब्जेक्ट का विस्तार करने के लिए एक गेट्टर का उपयोग किया। मुझे कैमरा रोल कोण की गणना करने की आवश्यकता थी ताकि मैं मानचित्र टाइलों को क्षितिज के समतल कर सकूं। Google अब स्वचालित रूप से बैक एंड पर करता है; लेकिन उस समय यह मेरे लिए maps.rollएक संपत्ति के रूप में पुनः प्राप्त करने के लिए मददगार था, न कि maps.roll()रिटर्न वैल। यह सिर्फ एक प्राथमिकता है।
रोज़ो

इसलिए यह कोड के बिना क्लीनर दिखने के लिए सिंटैक्टिक शुगर है। मैं नहीं देख सकते हैं क्यों तुम कर सकते थे साथ नहीं अपने उदाहरणmaps.roll()
एंड्रियास

@ और कौन कहता है कि मैं नहीं कर सका? जैसा मैं कहता हूं, यह मेरे विचारों को व्यवस्थित रखने में मदद करने का एक तरीका है। कोडिंग एक कला है। आप बॉब रॉस से यह नहीं पूछते हैं कि जब वह नारंगी इस्तेमाल कर सकता था तो उसे जले हुए गेरू का इस्तेमाल क्यों करना पड़ा। अब आपको एक आवश्यकता नहीं दिख सकती है, लेकिन एक दिन जब आप तय करते हैं कि आपकी पेंटिंग को थोड़ा जला हुआ गेरू चाहिए, तो यह आपके पैलेट पर होगा।
रोजो

:) एक चीज़ जो मुझे दिखती है कि सिंटैक्स मिलता है और सेट किया जाता है, अगर यह एक संपत्ति के रूप में उपयोग किया जाता है तो ऑटो-रन किया जा रहा है।
एंड्रियास

11

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

var counter = function() {
    var count = 0;

    this.inc = function() {
        count++;
    };

    this.getCount = function() {
        return count;
    };
};

var i = new Counter();
i.inc();
i.inc();
// writes "2" to the document
document.write( i.getCount());

यदि आप अभी भी भ्रमित हैं, तो जावास्क्रिप्ट में निजी सदस्यों पर क्रॉकफोर्ड के लेख पर एक नज़र डालें ।


39
मैं असहमत हूं। जानकारी को एन्कैप्सुलेट करने के लिए गेटर्स और सेटर भी बहुत उपयोगी होते हैं जिनकी परिभाषा केवल एक साधारण चर नहीं हो सकती है। यह आसान हो सकता है यदि आपको एक ऐसी प्रणाली के व्यवहार को बदलने की आवश्यकता है जो पहले सरल गुणों का उपयोग करती थी और जो अन्य चीजें निर्भर कर सकती हैं। इसके अलावा, आपका उदाहरण केवल "छद्म गेटर्स" प्रदर्शित करता है जो केवल कार्य हैं। रियल जावास्क्रिप्ट गेटर्स सरल मूल्यों के रूप में दिखाई देते हैं (और फ़ंक्शन संकेतन के बिना एक्सेस किए जाते हैं), इसलिए उनमें से वास्तविक शक्ति।
devios1

यकीन नहीं होता कि मैं उस शक्तिशाली को बुलाऊंगा। कुछ एक्स के रूप में दिखाई दे रहा है लेकिन वास्तव में वाई आवश्यक रूप से स्पष्ट नहीं है। मैं पूरी तरह से var baz = foo.barइसके पीछे छिपे व्यवहार का एक पूर्ण विकसित सेट होने की उम्मीद नहीं करूंगा । मैं होगा कि से उम्मीद foo.getBar()है, लेकिन।
AgmLauncher

8

मुझे लगता है कि पहला लेख आप इसे स्पष्ट रूप से बताता है:

इस तरह से जावास्क्रिप्ट लिखने का स्पष्ट लाभ यह है कि आप इसे अस्पष्ट मानों का उपयोग कर सकते हैं, जो आप उपयोगकर्ता को सीधे उपयोग नहीं करना चाहते हैं।

यहाँ लक्ष्य केवल एक विधि get()या set()विधि के माध्यम से उन तक पहुँच को अनुमति देकर खेतों को घेरना और सार करना है । इस तरह, आप जिस भी क्षेत्र में चाहें, आंतरिक रूप से फ़ील्ड / डेटा संग्रहीत कर सकते हैं, लेकिन बाहरी घटक केवल आपके प्रकाशित इंटरफ़ेस से दूर हैं। यह आपको बाहरी इंटरफ़ेस को बदलने के बिना आंतरिक परिवर्तन करने की अनुमति देता है set(), विधि के भीतर कुछ सत्यापन या त्रुटि-जांच करने के लिए , आदि।


6

यद्यपि अक्सर हम वस्तुओं को बिना किसी अभिगम नियंत्रण के सार्वजनिक गुणों के साथ देखने के लिए उपयोग किया जाता है, जावास्क्रिप्ट हमें गुणों का सही वर्णन करने की अनुमति देता है। वास्तव में, हम वर्णनकर्ताओं का उपयोग कर सकते हैं ताकि यह नियंत्रित किया जा सके कि किसी संपत्ति तक कैसे पहुंचा जा सकता है और हम उस पर कौन सा तर्क लागू कर सकते हैं। निम्नलिखित उदाहरण पर विचार करें:

var employee = {
    first: "Boris",
    last: "Sergeev",
    get fullName() {
        return this.first + " " + this.last;
    },
    set fullName(value) {
        var parts = value.toString().split(" ");
        this.first = parts[0] || "";
        this.last = parts[1] || "";
    },
    email: "boris.sergeev@example.com"
};

अंतिम परिणाम:

console.log(employee.fullName); //Boris Sergeev
employee.fullName = "Alex Makarenko";

console.log(employee.first);//Alex
console.log(employee.last);//Makarenko
console.log(employee.fullName);//Alex Makarenko

2

इसके बारे में इतना भ्रमित क्या है ... गेटर्स ऐसे फ़ंक्शंस हैं जिन्हें किसी प्रॉपर्टी मिलने पर कहा जाता है, जब आप इसे सेट करते हैं। उदाहरण के लिए, यदि आप करते हैं

obj.prop = "abc";

आप प्रॉपर्टी प्रोप को सेट कर रहे हैं, यदि आप गेटर्स / सेटर का उपयोग कर रहे हैं, तो सेटर फ़ंक्शन को एक तर्क के रूप में "एबीसी" के साथ बुलाया जाएगा। ऑब्जेक्ट के अंदर सेटर फ़ंक्शन की परिभाषा आदर्श रूप से कुछ इस तरह दिखाई देगी:

set prop(var) {
   // do stuff with var...
}

मुझे यकीन नहीं है कि ब्राउज़रों में यह कितना अच्छा है। ऐसा लगता है कि फ़ायरफ़ॉक्स में एक वैकल्पिक वाक्यविन्यास भी है, जिसमें डबल-अंडरस्कोर विशेष ("जादू") विधियां हैं। हमेशा की तरह इंटरनेट एक्सप्लोरर इसमें से किसी का समर्थन नहीं करता है।


2

आप कंस्ट्रक्टर के प्रोटोटाइप के माध्यम से js वर्ग के लिए इंस्टेंस विधि को परिभाषित कर सकते हैं।

निम्नलिखित नमूना कोड है:

// BaseClass

var BaseClass = function(name) {
    // instance property
    this.name = name;
};

// instance method
BaseClass.prototype.getName = function() {
    return this.name;
};
BaseClass.prototype.setName = function(name) {
    return this.name = name;
};


// test - start
function test() {
    var b1 = new BaseClass("b1");
    var b2 = new BaseClass("b2");
    console.log(b1.getName());
    console.log(b2.getName());

    b1.setName("b1_new");
    console.log(b1.getName());
    console.log(b2.getName());
}

test();
// test - end

और, यह किसी भी ब्राउज़र के लिए काम करना चाहिए, आप इस कोड को चलाने के लिए केवल नोडज का भी उपयोग कर सकते हैं।


1
यह सिर्फ नया गेटनेम, और सेटनाम विधियों का निर्माण कर रहा है। ये संपत्ति बनाने से संबंधित नहीं हैं!
uzay95

2

मेरे द्वारा पढ़ी गई व्याख्या से मैं कुछ उलझन में था, क्योंकि मैं एक मौजूदा प्रोटोटाइप में एक संपत्ति जोड़ने की कोशिश कर रहा था जो मैंने नहीं लिखा था, इसलिए प्रोटोटाइप को बदलना गलत दृष्टिकोण की तरह लग रहा था। तो, पोस्टीरिटी के लिए, यहाँ बताया गया lastहै Array:

Object.defineProperty(Array.prototype, "last", {
    get: function() { return this[this.length - 1] }
});

कभी एक समारोह IMHO जोड़ने की तुलना में थोड़ा अच्छा।


1

यदि आप एक्सेसरों की अवधारणा का उल्लेख कर रहे हैं, तो सरल लक्ष्य है कि अंतर्निहित भंडारण को मनमाने ढंग से हेरफेर से छिपाया जाए। इसके लिए सबसे चरम तंत्र है

function Foo(someValue) {
    this.getValue = function() { return someValue; }
    return this;
}

var myFoo = new Foo(5);
/* We can read someValue through getValue(), but there is no mechanism
 * to modify it -- hurrah, we have achieved encapsulation!
 */
myFoo.getValue();

यदि आप वास्तविक जेएस गेट्टर / सेटर सुविधा की बात कर रहे हैं, जैसे। defineGetter/ defineSetter, या { get Foo() { /* code */ } }, फिर यह ध्यान देने योग्य है कि अधिकांश आधुनिक इंजनों में उन गुणों के बाद के उपयोग की तुलना में बहुत अधिक धीमी गति से होगा अन्यथा। जैसे। के प्रदर्शन की तुलना करें

var a = { getValue: function(){ return 5; }; }
for (var i = 0; i < 100000; i++)
    a.getValue();

बनाम

var a = { get value(){ return 5; }; }
for (var i = 0; i < 100000; i++)
    a.value;

-1

मैं तुम लोगों के लिए एक है कि थोड़ा बदसूरत हो सकता है, लेकिन यह get'er प्लेटफार्मों भर में किया है

function myFunc () {

var _myAttribute = "default";

this.myAttribute = function() {
    if (arguments.length > 0) _myAttribute = arguments[0];
    return _myAttribute;
}
}

इस तरह, जब आप कॉल करते हैं

var test = new myFunc();
test.myAttribute(); //-> "default"
test.myAttribute("ok"); //-> "ok"
test.myAttribute(); //-> "ok"

यदि आप वास्तव में चीजों को मसाला देना चाहते हैं .. तो आप एक टाइपोफ चेक डाल सकते हैं:

if (arguments.length > 0 && typeof arguments[0] == "boolean") _myAttribute = arguments[0];
if (arguments.length > 0 && typeof arguments[0] == "number") _myAttribute = arguments[0];
if (arguments.length > 0 && typeof arguments[0] == "string") _myAttribute = arguments[0];

या उन्नत टाइपो चेक के साथ भी क्रेज़ियर जा सकते हैं: type.of () कोड codingforums.com पर


बिंदु को सार्वजनिक इंटरफ़ेस को बदलने की आवश्यकता के बिना कुछ कट्टर लोगों के लिए एक विशेषता को बदलने में सक्षम होना था। कॉल () टैग जोड़ने से यह बदल जाता है।
माइकल स्कॉट कटहबर्ट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.