12

में जावास्क्रिप्ट गेटर समर्थन इस कोड को देखें। यह एक बहुत ही सरल जावास्क्रिप्ट वस्तु है जो Module Pattern का उपयोग कर कार्यान्वित किया जाता है (और आप this fiddle address पर लाइव उदाहरण देख सकते हैं)आईई 8

var human = function() { 
    var _firstName = ''; 
    var _lastName = '' 
    return { 
     get firstName() { 
      return _firstName; 
     }, get lastName() { 
      return _lastName; 
     }, set firstName(name) { 
      _firstName = name; 
     }, set lastName(name) { 
      _lastName = name; 
     }, get fullName() { 
      return _firstName + ' ' + _lastName; 
     } 
    } 
}(); 
human.firstName = 'Saeed'; 
human.lastName = 'Neamati'; 
alert(human.fullName); 

हालांकि, IE8 जावास्क्रिप्ट get और set कीवर्ड का समर्थन नहीं करता है। आप दोनों इसका परीक्षण कर सकते हैं और MDN देख सकते हैं।

इस स्क्रिप्ट को आईई 8 के साथ संगत बनाने के लिए मुझे क्या करना चाहिए?

उत्तर

22

इस स्क्रिप्ट को आईई 8 के साथ संगत बनाने के लिए मुझे क्या करना चाहिए?

इसे पूरी तरह से बदलें।

human.firstName = 'Saeed'; 
human.lastName = 'Neamati'; 
alert(human.getFullName()); 

बाकी किसी ने IE में एक डोम वस्तु का उपयोग करने और Object.defineProperty() उपयोग करने वाली प्रॉपर्टी को जोड़ने का सुझाव: उदाहरण के लिए, बजाय एक्सेसर गुण का उपयोग कर के, सामान्य गुण और कार्यों का एक संयोजन का उपयोग करें।

var human = document.createElement('div'); 
Object.defineProperty(human, 'firstName', { ... }); 
Object.defineProperty(human, 'lastName', { ... }); 
Object.defineProperty(human, 'children', { value: 2 }); 

alert(human.children); 
//-> "[object HTMLCollection]", not 2 

यह सच है: यह काम कर सकते हैं, मैं अत्यधिक कई कारण हैं, एक उदाहरण है कि कोड आप लिखते हैं सभी ब्राउज़रों में संगत नहीं हो सकता है के लिए इस दृष्टिकोण के खिलाफ की सलाह देते हैं कम से कम क्रोम का। किसी भी तरह से यह कोड लिखना सुरक्षित और आसान है जो उन सभी ब्राउज़रों में काम करता है जिन्हें आप समर्थन देना चाहते हैं। गेटर्स और सेटर्स का लाभ उठाने के लिए कोड लिखने में सक्षम होने से प्राप्त कोई भी सुविधा आपके द्वारा विशेष रूप से इंटरनेट एक्सप्लोरर 8.

पर लक्षित कोड पर खो गया है, यह निश्चित रूप से प्रदर्शन में कमी के अलावा, तथ्य यह है कि आप ऑब्जेक्ट पर for...in लूप का उपयोग करने में सक्षम नहीं होंगे और जब आप उस प्रॉपर्टी का उपयोग करते हैं, जिसे आप परिभाषित करते हैं तो संभावित भ्रम आ रहा है लेकिन डीओएम ऑब्जेक्ट पर पूर्व-मौजूद था।

+0

मेरा मतलब है कि मैं अपना कोड पिछड़ा संगत कैसे बना सकता हूं। जावास्क्रिप्ट में मॉड्यूल पैटर्न को कार्यान्वित करने का समाधान क्या है जो आईई 8 में भी काम करता है, और जिसमें गेटर गुण हैं? –

+1

@ सईदनेमाती यदि आप वास्तव में गेटर्स/सेटर्स चाहते हैं, तो आप दो चीजें कर सकते हैं: 1) '.getMyValue' और' .setMyValue', या 2) जैसी विधियां बनाएं, वे मान स्वीकार करें जो मान स्वीकार करते हैं, या यदि कोई मान नहीं दिया जाता है तो इसे वापस कर दें (जैसे jQuery कुछ तरीकों से करता है - यदि आप एक मान देते हैं तो यह सेट होता है, अगर आप कोई मूल्य नहीं देते हैं तो यह मिलता है)। –

+1

सबसे खराब जवाब कभी। विश्वास नहीं कर सकता कि यह बहुत ऊपर उठ गया है। – DontVoteMeDown

8

आप नहीं (as Andy answered)

निकटतम विकल्प होगा सकते हैं

var human = function() { 
    var _firstName = ''; 
    var _lastName = ''; 

    return { 
     firstName: function() { 
      if (arguments.length === 1) { 
       _firstName = arguments[0]; 
      } 
      else { 
       return _firstName; 
      } 
     }, 
     lastName: function() { 
      if (arguments.length === 1) { 
       _lastName = arguments[0]; 
      } 
      else { 
       return _lastName; 
      } 
     }, 
     fullName: function() { 
      return _firstName + ' ' + _lastName; 
     } 
    }; 
}(); 

human.firstName('Saeed'); 
human.lastName('Neamati'); 

alert(human.fullName()); 

डेमो पर http://jsfiddle.net/gaby/WYjqB/2/

+0

आईई हमेशा बेकार है। हालांकि माइक्रोसॉफ्ट के कई अच्छे उत्पाद हैं, लेकिन मैं वास्तव में माइक्रोसॉफ्ट से नफरत करता हूं, केवल इसकी आईई के कारण। –

+1

@ सईद: वास्तव में, यह एक परिदृश्य है जहां यह माइक्रोसॉफ्ट की गलती नहीं है। गेटर्स और सेटर्स ईसीएमए -262 विनिर्देश के लिए हाल ही में जोड़े गए हैं। आईई 9 'ऑब्जेक्ट.डेफिनप्रॉपर्टी()' के माध्यम से गेटर्स और सेटर्स का समर्थन करता है। आप जिस कार्यान्वयन का उपयोग कर रहे हैं (मोज़िला) गैर मानक है और वैसे भी कई ब्राउज़रों में काम करने की गारंटी नहीं है। –

+1

लेकिन @ गैबी, फ़ायरफ़ॉक्स ने इसे संस्करण 2.0 से, संस्करण 1 से क्रोम, संस्करण 3.5 से सफारी और संस्करण 9.5 से ओपेरा का समर्थन किया है। तो, यह कैसे है कि आईई 8 ऐसी चीज का समर्थन नहीं कर सकता है? –

4

पर http://robertnyman.com/2009/05/28/getters-and-setters-with-javascript-code-samples-and-demos/

भविष्य यह जाँच करें, और ECMAScript मानक में ऑब्जेक्ट्स को विस्तारित करने का आकार, ऑब्जेक्ट.डेफिनप्रोपर्टी के माध्यम से सभी प्रकार के तरीकों से है। इस प्रकार इंटरनेट एक्सप्लोरर ने गेटर्स और सेटर्स को लागू करना चुना है, लेकिन यह दुर्भाग्य से अब तक केवल इंटरनेट एक्सप्लोरर 8 में उपलब्ध है, और में कोई अन्य वेब ब्राउज़र नहीं है। इसके अलावा, आईई 8 केवल डीओएम नोड्स पर इसका समर्थन करता है, लेकिन भविष्य के संस्करणों को जावास्क्रिप्ट ऑब्जेक्ट्स पर के रूप में इसका समर्थन करने की योजना है।

आपको कम से http://robertnyman.com/javascript/javascript-getters-setters.html#object-defineproperty

Object.defineProperty(document.body, "description", { 
    get : function() { 
     return this.desc; 
    }, 
    set : function (val) { 
     this.desc = val; 
    } 
}); 
document.body.description = "Content container"; 

परिणाम एक ही साइट पर परीक्षण मामलों पा सकते हैं:

document.body.description = "Content container" 
+0

परिणाम को सही किया। –

5

IE8 डोम नोड्स पर getters और setters का समर्थन करता है, इसलिए यदि आप वास्तव में चाहते हैं गेटर्स और सेटर्स, आप यह कर सकते हैं:

var objectForIe8 = $("<div></div>")[0];  
Object.defineProperty(objectForIe8, "querySelector", { 
    get: function() { 
     return this.name; 
    }, 
    set: function(val) { 
     this.name = val+", buddy"; 
    } 
}); 
// notice you can overwrite dom properties when you want to use that property name 
objectForIe8.querySelector = "I'm not your guy"; 

alert(objectForIe8.querySelector); 

नोट यह आपको कुछ हद तक महत्वपूर्ण प्रदर्शन हिट देता है, इसलिए यदि आप इस तरह की हजारों ऑब्जेक्ट्स बनाने की ज़रूरत है तो मैं इस तकनीक का उपयोग नहीं करूंगा। लेकिन यदि आप इस विशेष वस्तु के प्रदर्शन के बारे में चिंतित नहीं हैं, तो यह आपको ज्वार कर देगा। और यदि आप IE8 प्रदर्शन के बारे में कम परवाह नहीं कर सकते हैं, और बस इसे काम करना चाहते हैं, तो इस तकनीक का उपयोग केवल 8 के लिए करें और आप सुनहरे हैं:

+1

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

+2

जबकि सुनहरा समाधान नहीं है (आईई का उपयोग करते समय उसमें वसा का मौका), यह वास्तव में सवाल का जवाब देता है ... –

+2

धन्यवाद। मुझे बस सत्र की अवधि के लिए मूल्यों को स्टोर/पुनर्प्राप्त करने के लिए एक कॉम्पैक्ट और सरल वर्ग की आवश्यकता थी। इससे मेरे लिए आवश्यक होने पर संपत्ति घोषित करना और उपयोग करना आसान हो गया। – gouderadrian