हम वैश्विक वस्तु के कुछ अंतर्निहित गुणों को क्यों हटा सकते हैं?


12

मैं इन दिनों es5 पढ़ रहा हूं और पाता हूं कि [[विन्यास योग्य] कुछ अंतर्निहित वैश्विक गुणों की विशेषता सत्य पर सेट है जिसका अर्थ है कि हम इन गुणों को हटा सकते हैं।

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

Array.prototype ऑब्जेक्ट की ज्वाइन विधि में विशेषताएँ हैं

{[[Writable]]:true, [[Enumerable]]: false, [[Configurable]]: true}

तो हम आसानी से Array के लिए जुड़ने की विधि को हटा सकते हैं जैसे:

delete Array.prototype.join;
alert([1,2,3].join);

चेतावनी undefinedमेरे क्रोमियम 17, फ़ायरफ़ॉक्स 9, यानी 10, यहां तक ​​कि ie6 में प्रदर्शित होगी ;

Chrome 15 और सफारी में 5.1.1 [[विन्यास योग्य]] विशेषता सत्य पर सेट है और परिणाम को हटाना भी सही है लेकिन अंतिम परिणाम अभी भी है function(){[native code]}। ऐसा लगता है कि यह एक बग है और क्रोमियम इसे ठीक करता है।

मैंने पहले ऐसा नहीं देखा। मेरी राय में, उपयोगकर्ता के कोड में अंतर्निहित कार्यों को हटाना खतरनाक है, और दूसरों के साथ काम करते समय इतने सारे कीड़े लाएगा। तो ECMAScript ने यह निर्णय क्यों लिया?


एकाधिक उत्तर गुणों को हटाकर अंतर्निहित कार्यक्षमता को अनुकूलित करने की क्षमता की सराहना करते हैं लेकिन यह दृष्टिकोण केवल आवश्यक है क्योंकि कार्यक्षमता DI का उपयोग करने के बजाय वैश्विक चर में कठोर है। ऐसा लगता है कि संपत्तियों को हटाकर कस्टमाइज़ करना मौलिक रूप से खराब डिज़ाइन के आसपास एक हैक है। उदाहरण के लिए, यदि आपको JSON पार्सर को बदलने में सक्षम होने की आवश्यकता है, तो आप कोड लिख सकते हैं जो इनपुट के रूप में JSON पार्सर लेता है।
मोनिका

जवाबों:


2

मैं आपसे सहमत होना चाहूंगा, लेकिन दूसरी ओर मुझे सिर्फ एक ऐसी स्थिति मिली जहां मुझे delete JSON.stringifyकुछ परिस्थितियों में फ़ायरफ़ॉक्स 3.5 में बग की वजह से ज़रूरत थी । मैं निश्चित रूप से वहां बंदर-पैच के निर्माण की क्षमता से खुश था।


आप इसे सिर्फ ओवरराइड क्यों नहीं करते?
डिमिक्स

2
क्योंकि जो अगली चीज होती है, वह JSON2.js भरी हुई होती है, जो कि उपस्थिति का पता लगाती है JSON.stringifyऔर यदि आवश्यक हो तो इसे इंजेक्ट करती है। क्षमा याचना, मैंने अपने उत्तर में यह नहीं बताया।
N3dst4

इसलिए आप JSON2.js के स्रोत कोड को भी संशोधित कर सकते हैं,
demix

तीसरे पक्ष के पुस्तकालयों को संशोधित करना एक बुरा विचार है क्योंकि तब आप अपने सभी परिवर्तनों की नकल किए बिना उन्हें अपग्रेड नहीं कर सकते हैं।
N3dst4

1

विन्यास हटाने के बारे में नहीं है।

यह केवल रीड वैल्यू को बदलने की क्षमता के बारे में है ।

यह एक बहुत ही शक्तिशाली उपकरण है, और यदि आप उन्हें हटा नहीं सकते हैं तो गैर-विन्यास योग्य मूल्य निराशाजनक हैं।

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

उदाहरण:

Object.defineProperty(Object.prototype, "foo", {
  value: 42,
  configurable: true
});

var o = {};
o.foo = 50; // fails. foo is not writable
delete Object.prototype.foo;
o.foo = 50; // succeeds
/* optionally put Object.prototype.foo back */

संपूर्ण विचार यह है कि यदि आप ऐसे गुण हटा सकते हैं जो आपके पास अधिक मेटा प्रोग्रामिंग नियंत्रण हैं। यदि आप उन्हें हटा नहीं सकते तो आप भाषा पर नाराज हो जाएंगे।

लोगों को परेशान करने के लिए गुणों को गैर-हटाने योग्य बनाने के लिए कोई अच्छा कारण नहीं है।


1
[[लिखने योग्य]] गुण मान को बदलने की क्षमता को नियंत्रित करते हैं। ES5: [[लिखने योग्य]] बूलियन यदि गलत है, तो ECMAScript कोड द्वारा संपत्ति के [[मूल्य]] को बदलने का प्रयास [[पुट]] का उपयोग करने में सफल नहीं होगा। । [[कॉन्फ़िगर करने योग्य]] बूलियन यदि गलत है, तो संपत्ति को हटाने का प्रयास, संपत्ति को एक्सेसर संपत्ति में बदलने के लिए, या इसकी विशेषताओं को बदलने के लिए ([[मूल्य] के अलावा]) विफल हो जाएगा।
डिमिक्स

@ डेमिक्स हाँ, यह सही है ...
रेयनोस

0

.. उपयोगकर्ता के कोड में निर्मित कार्य खतरनाक है

बिल्कुल इसके विपरीत। अनुकूलन की अनुमति अच्छी है क्योंकि यह वेबसाइट लेखकों को अधिक लचीलापन प्रदान करने की अनुमति देता है।

यदि वेबसाइट लेखक को उसी JS VM के भीतर 3rd पार्टी कोड लोड करने की आवश्यकता है और ऐसा करने के लिए inbuilt JS parser का उपयोग करना चाहते हैं, तो वह हमेशा 3rd पार्टी कोड लोड करने से पहले उन्हें गैर-कॉन्फ़िगर करने के लिए सेट करके गुणों को सुरक्षित कर सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.