2013-07-25 8 views
6

मैं एक विश्वसनीय API के साथ काम कर रहा हूं, और मेरा जावास्क्रिप्ट कोड jQuery के $ .ajax() कॉल के माध्यम से आरईएसटी क्वेरी कर रहा है।जावास्क्रिप्ट प्रोटोटाइप निरंतर घोषणा

मैं (बहुत सरल) एक जावास्क्रिप्ट बाकी वर्ग है, जो मैं नीचे प्रदर्शित करेगी लागू कर दिया है:

var Rest = function (baseUrlPath, errorMessageHandler) { 
     ... 
    }; 

// Declare HTTP response codes as constants 
Rest.prototype.STATUS_OK = 200; 
Rest.prototype.STATUS_BAD_REQUEST = 400; 

... // other rest methods 

Rest.prototype.post = function (params) { 
     $.ajax({ 
      type: 'POST', 
      url: params.url, 
      data: params.data, 
      dataType: 'json', 
      contentType: 'application/json; charset=utf-8', 
      beforeSend: this._authorize, 
      success: params.success, 
      error: params.error || this._getAjaxErrorHandler(params.errorMessage) 
     }); 
     }; 

... // more rest methods 

Rest.prototype.executeScenario = function (scenarioRef) { 
     var self = this; 

     this.post({ 
      url: 'myurlgoeshere', 
      data: 'mydatagoeshere', 
      success: function (data, textStatus, xhr) { 
       if (xhr.status == 200) { 
        console.log("everything went ok"); 
       } 
      }, 
      error: function (xhr, textStatus, errorMsg) { 
       // TODO: constants 
       if (404 == xhr.status) { 
        self.errorMessageHandler("The scenario does not exist or is not currently queued"); 
       } else if (403 == xhr.status) { 
        self.errorMessageHandler("You are not allowed to execute scenario: " + scenarioRef.displayName); 
       } else if(423 == xhr.status) { 
        self.errorMessageHandler("Scenario: " + scenarioRef.displayName + " is already in the queue"); 
       } 
      } 
     }); 
    }; 

कोड काम करता है के रूप में इरादा, हालांकि मैं कोड सुशोभित और बेहतर बनाने में मदद करने के लिए कुछ स्थिरांक जोड़ने का निर्णय लिया है पठनीयता। मेरे उदाहरण के लिए मेरे कोड में कई जगहें हैं जहां मैं xhr.status == 200 या xhr.status == 400 और इसी तरह की जांच कर रहा हूं।

मैं के रूप में Rest.prototype.STATUS_OK = 200;

वर्ग चर घोषणा कर सकते हैं लेकिन चर संपादन योग्य है, और मैं उन्हें कैसे स्थिर बनाने के लिए नहीं सोच सकते हैं। उदाहरण के लिए मेरे कोड में मैं this.STATUS_OK = 123; कर सकता हूं और यह चर को संशोधित करेगा। मैंने बिना भाग्य के, कॉन्स कीवर्ड के साथ खेला है।

मैंने यह देखा है: Where to declare class constants?, लेकिन यह बहुत मदद नहीं थी।

क्या कोई मुझे सही दिशा में इंगित कर सकता है कि इन क्षेत्रों को चर के बजाय निरंतर शाब्दिक कैसे बनाया जाए?

+0

कृपया ध्यान दें कि "फ़ील्ड" * गुण * हैं, नहीं * चर *। चर के लिए आप बस ['const' कीवर्ड] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/const) का उपयोग कर सकते हैं जहां समर्थित है। लेकिन आप वैसे भी स्थानीय-स्कोप करेंगे :-) – Bergi

उत्तर

8

का उपयोग ECMAScript 5 के Object.defineProperty आप एक मूल्य के अन-settable बना सकते हैं:

Object.defineProperty(Rest, "STATUS_OK", { 
    enumerable: false, // optional; if you care about your enumerated keys 
    configurable: false, 
    writable: false, 
    value: 200 
}); 

या, के बाद से उन मूलभूत मूल्यों कर रहे हैं, बस कार्य करें:

Object.defineProperty(Rest, "STATUS_OK", { value: 200 }); 

यह Rest.STATUS_OK उपजबनाता हैएक्सेस होने पर, लेकिन यह इसे फिर से परिभाषित करने या delete को फिर से परिभाषित करने के प्रयासों का जवाब नहीं देगा। इसके अलावा, configurable: false बाद में defineProperty कॉल के साथ संपत्ति को फिर से परिभाषित करने के किसी भी प्रयास को रोक देगा।

हालांकि, यह older browsers that don't support ES5's defineProperty (विशेष रूप से IE8 और नीचे) में काम नहीं करता है।

+0

यह एक अच्छा कामकाज है, लेकिन ऐसा लगता है कि यह एक कड़वाहट जैसा लगता है एकल स्थिरता सेट करने के लिए कोड की कई पंक्तियां लिखना है (मुझे इसके एक कथन को पता है, लेकिन अभी भी पठनीयता के लिए कई लाइनें हैं)। और निश्चित रूप से बहुत सारे काम जब आपके पास घोषित करने के लिए बहुत सारे स्थिरांक हैं। शायद भविष्य में इसके लिए बेहतर समर्थन होगा क्योंकि आईई 8 और नीचे चरणबद्ध हैं। – Husman

+5

@ हसमैन: असल में आप सभी लाइनों को छोड़ सकते हैं लेकिन 'मान', क्योंकि 'झूठी' उन लोगों के लिए डिफ़ॉल्ट है। – Bergi

+0

@ बर्गि गुड कॉल; मैंने आपके सुझाव के अनुसार अपना जवाब संपादित किया। – apsillers

1

यह जावास्क्रिप्ट में संभव नहीं होगा।

var StatusCode = (function() { 
    var STATUS_OK = 200, 
     STATUS_BAD_REQUEST = 400; 

    return { 
     getOk: function() { 
      return STATUS_OK; 
     }, 
     getBadRequest: function() { 
      return STATUS_BAD_REQUEST; 
     } 
    } 

}); 

और StatusCode.getOk() === 200 की तरह उपयोग: सबसे अच्छी बात तो आप शायद कर सकता है, सामान की तरह कुछ बंद पैदा करते हैं। यह आपको उन 'स्थिरांक' को बदलने में सक्षम नहीं होने में आपकी सहायता करेगा, लेकिन आपकी पठनीयता के लिए फिर से खराब होगा (यह शायद राय आधारित है)। मैं उन स्थिरांक को सभी अपरकेस को स्थिर रूप से चिह्नित करने के लिए रखूंगा, हालांकि उन्हें बदला जा सकता है।

+1

+1; इसके अलावा, कोई कारण नहीं है कि कोई 'फ़ंक्शन() {वापसी "कुछ और" के साथ' getOk' को आसानी से ओवरराइट नहीं कर सका; } '। – apsillers

+1

@apsillers अच्छा बिंदु। नीचे की रेखा के रूप में, आप जावास्क्रिप्ट में सुरक्षित रूप से कुछ भी सुरक्षित नहीं कर सकते हैं। विशिष्ट उदाहरण - यहां तक ​​कि 'अपरिभाषित' भी ओवरराइड किया जा सकता है। –

1

आप स्थिति को गेटर्स के रूप में परिभाषित कर सकते हैं, लेकिन AFAIK यह IE8 और पुराने में काम नहीं करेगा।

var Rest = function (baseUrlPath, errorMessageHandler) { 
     this.STATUS_OK = 123; // trying to override. 
    }; 

// Declare HTTP response codes as constants 
Rest.prototype = { 
    get STATUS_OK(){ return 200; }, 
    get STATUS_BAD_REQUEST(){ return 400; } 
} 

var client = new Rest(); 
console.log(client.STATUS_OK); // 200! 
client.STATUS_OK = 123; 
console.log(client.STATUS_OK); // still 200! 

अधिक getters और setters पर: http://ejohn.org/blog/javascript-getters-and-setters/

+0

'ऑब्जेक्ट.डेफिनप्रॉपर्टी (रेस्ट.प्रोटोटाइप, "स्टेटस_ओके", {प्राप्त करें: फ़ंक्शन() {वापसी 123;}}); और आप बाहर हैं :-) – Bergi

0

जावास्क्रिप्ट को अपरिवर्तनीय स्थिरांक बनाने के लिए कोई अच्छा समर्थन नहीं है। यहां तक ​​कि const कीवर्ड की अनुशंसा नहीं की जाती है क्योंकि कुछ ब्राउज़रों में काम नहीं करता है।

मुझे लगता है कि सबसे अच्छा तरीका है कार्य करने की यह Object.freeze उपयोग कर रहा है:

Rest.Status = {}; 
Rest.Status.Ok = "Ok"; 
Object.freeze(Rest.Status); 

Object.freeze मूक स्थिति वस्तु में परिवर्तन पर ध्यान नहीं देगा। उदाहरण द्वारा:

Rest.Status.Ok = "foo"; 
Rest.Status.Ok; //=> "Ok" 

लेकिन अभी ऊपर ECMAScript 5 या में काम करते हैं।

से ऊपर मैं एक Status वस्तु में स्थिति रखा है, मुझे लगता है कि यह prototype से अधिक दिलचस्प है, क्योंकि प्रोटोटाइप उदाहरण विधियों, गुण आदि और स्थिति वस्तु एक गणन की तरह देखा के लिए और अधिक करीब है।

+0

ध्यान दें कि यह अभी भी 'Rest.Status' प्रॉपर्टी के पुन: असाइनमेंट को पूरी तरह से अलग ऑब्जेक्ट में पुन: असाइन करने की अनुमति देता है। – apsillers

+0

हां, मुझे यह एहसास नहीं हुआ है। एक विकल्प एक RestStatus वस्तु बना देगा, लेकिन इस तरह दो वैश्विक चर मौजूद होंगे :( –

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