ईएस 6 प्रैक्टिस में

ईसीएमएस्क्रिप्ट 2015 की उपस्थिति के साथ, सुविधाओं का एक हिमस्खलन आया; उनमें से कुछ आपको पागल बना देते हैं, और अन्य सुखद आश्चर्य करते हैं, जैसे लंबे समय के बाद एक पुराने दोस्त से मिलना।


कुछ विशेषताएं मेटाप्रोग्रामिंग से संबंधित हैं। वह क्या है? मैं बहुत वाक्पटु नहीं हूं, तो चलिए अपने मित्र विकिपीडिया की ओर रुख करते हैं।


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

संक्षेप में, मेटाप्रोग्रामिंग एक प्रोग्राम को संकलन या निष्पादन दोनों समय दूसरों को या खुद को हेरफेर करने की अनुमति देता है। जावास्क्रिप्ट में मेटाप्रोग्रामिंग दो विशेषताओं पर आधारित है: प्रॉक्सी और रिफलेक्ट एपीआई। इस पोस्ट में, हम पहले वाले पर विचार करेंगे।


प्रतिनिधि


प्रॉक्सी एक नया एपीआई है जो रनटाइम में ऑब्जेक्ट्स को इंटरसेप्ट करने, मॉडिफाई करने और विस्तार करने की अनुमति देता है। इस एपीआई का उपयोग करना, आप कर सकते हैं:


  • प्रोफ़ाइल और डीबग लॉग,
  • संपत्तियों के लिए अवरोधक कॉल,
  • मान्यवर "मक्खी पर",
  • आदि

प्रॉक्सी एक निर्माणकर्ता है जो दो मापदंडों को स्वीकार करता है: स्रोत ऑब्जेक्ट और ऑब्जेक्ट जो स्रोत ऑब्जेक्ट के लिए हैंडलर के रूप में कार्य करता है। उत्तरार्द्ध में ऐसे तरीके शामिल हैं जिन्हें जाल के रूप में जाना जाता है।



ट्रैप एक ऐसी विधि है जो वस्तु के कुछ हिस्से के व्यवहार को संशोधित करती है। उदाहरण के लिए, जाल हो जाता है और इस प्रक्रिया से पहले और इस दौरान तर्क रखने में सक्षम होने के लिए क्रमशः मूल्य प्राप्त करने और स्थापित करने के लिए कॉल को अवरोधन स्थापित करता है।


परदे के पीछे की उपयोगिता को बेहतर ढंग से समझने के लिए आइए करते हैं कुछ छोटे-छोटे व्यायाम।


उदाहरण: लॉगिंग / प्रोफाइलिंग


जरा सोचिए, आप 17 साल के हैं, पहले से ही 18 साल के हो गए। और आप चाहते हैं कि जब आप इसे खोलते हैं तो आपका कार्यक्रम आपको स्वचालित रूप से बधाई देता है। इसके लिए आप प्रॉक्सी का इस्तेमाल कर सकते हैं।


et person = { name: "John Doe", age: 17 }; person = new Proxy(person, { set(target, property, value) { if (value === 18) { console.log("Congratulations! You are of legal age"); Reflect.set(target, property, value); return true; } } }); person.age = 18; Not only can we do logs, as I said at the beginning, we can do as far as the language limits us. Here we could make validations for the age, for example, if it exceeds 100 that throw us an error: if (value < 13 && value > 99) { throw new Error('The age should be between 13 and 99') } else { Reflect.set(target, property, value) } Example: secure access to properties let person = { name: "John Doe" }; const Undefined = new Proxy( {}, { get(target, name, receiver) { return Undefined; } } ); const Safeish = obj => { return new Proxy(obj, { get(target, property, receiver) { if (target.hasOwnProperty(property)) { const isObject = target[property] instanceof Object; return isObject ? Safeish(target[property]) : Reflect.get(target, property, receiver); } return Undefined; } }); }; person = Safeish(person); console.log(person.name); console.log(person.sister.name === Undefined); 

उदाहरण: क्वेरी सरणी


हमने पहले से ही एक उदाहरण देखा है, जिसमें सबसे अधिक उपयोग किया जाता है और जाल सेट किया जाता है। सुदृढ़ करने के लिए, आइए थोड़ा आगे बढ़ें और नेस्टेड परदे का उपयोग करें। यह अभ्यास क्लासिक SQL GroupBy जैसे ऑपरेटरों का उपयोग करने के लिए एक पारंपरिक सरणी को क्वेरी करने योग्य सरणी में बदलने का प्रयास करेगा।


इसके लिए, हमें दो इनपुट मापदंडों की आवश्यकता होगी:


  • संग्रह: वस्तुओं की सरणी जो हम विस्तारित करेंगे।
  • groupKeys: स्ट्रिंग्स की सरणी जो उन गुणों का प्रतिनिधित्व करती है जिनके लिए आप समूह में जा रहे हैं (नाम, श्रेणी, मूल्य, आदि)

 const data = [ { id: 1, category: 2, name: "Intel NUC Hades Canyon" }, { id: 2, category: 1, name: "Logitech K380" }, { id: 3, category: 1, name: "Genius ECO-8100" } ]; const groupable = (collection, groupKeys) => { // Check that the collection is an array if (!(collection instanceof Array)) { throw new TypeError("The input collection is not an Array"); } const data = JSON.parse(JSON.stringify(collection)); const clone = JSON.parse(JSON.stringify(collection)); Object.defineProperty(clone, "groupBy", { configurable: true, enumerable: false, writable: false, value: groupKeys.reduce((acc, cur) => { acc[cur] = null; return acc; }, {}) }); 

  return new Proxy(clone, { get(target, property, receiver) { if (property === "groupBy") { return new Proxy(target[property], { get(target, property, receiver) { // if the property to be grouped does not exist // log a warning and return [] if (!target.hasOwnProperty(property)) { return []; } // Otherwise, group by property return data.reduce(function(acc, cur) { (acc[cur[property]] = acc[cur[property]] || []).push(cur); return acc; }, {}); } }); } return Reflect.get(target, property, receiver); } }); }; const datasource = groupable(data, ["category"]); console.log(datasource.groupBy.category); 

निष्कर्ष


प्रॉक्सी शायद सबसे अधिक इस्तेमाल किया जाने वाला ईएस 6 फीचर नहीं है, लेकिन रिफ्लेक्ट एपीआई के साथ मिलकर यह सबसे महत्वपूर्ण और दिलचस्प है। इसका लचीलापन इसे कई मामलों में अपनाने की अनुमति देता है और, सबसे अच्छा, इसे लागू करना आसान है।


संदर्भ


https://es.wikipedia.org/wiki/Metaprogramaci%C3%B3n

Source: https://habr.com/ru/post/hi448214/


All Articles