दिलचस्प पोस्ट
उलट दिशा में सीएसएस एनीमेशन का पुनः उपयोग करें (राज्य को रीसेट करके?) स्विफ्ट भाषा में एपरसैंड (एंड) का क्या अर्थ है? मैं एक स्टैक ट्रेस को स्ट्रिंग में कैसे रूपांतरित कर सकता / सकती हूं? मुख्य विधि कोड पूरी कोशिश / पकड़ में है: क्या यह बुरा व्यवहार है? एक स्ट्रिंग एक डेटटाइम में कनवर्ट करें मैं iPhone पर एक रेखा कैसे खींचूं? एनीमेशन चालू / बंद करने के लिए स्विंग टाइमर का उपयोग कैसे करें अजगर का आदेश दिया तत्व क्रम नहीं रखते हुए नोड में नष्ट करना। जेएस रिक्त बुलियन के लिए चेकबॉक्स क्या एन्क्टीप = 'मल्टीपार्ट / फॉर्म-डेटा' का मतलब है? प्रक्रिया पेड़ प्रोग्राम को सी # में मार दें Matplotlib में पंक्ति का रंग सेट करने के लिए Colormaps का उपयोग करना console.log () async या सिंक? नाम के आधार पर संपत्ति मूल्य कैसे प्राप्त करें

प्रोटोटाइप के तरीकों को असाइन करना * अंदर * कन्स्ट्रक्टर फ़ंक्शन – क्यों नहीं?

स्टाइलिस्टिक रूप से, मैं इस संरचना को पसंद करता हूं:

var Filter = function( category, value ){ this.category = category; this.value = value; // product is a JSON object Filter.prototype.checkProduct = function( product ){ // run some checks return is_match; } }; 

इस संरचना के लिए:

 var Filter = function( category, value ){ this.category = category; this.value = value; };// var Filter = function(){...} Filter.prototype.checkProduct = function( product ){ // run some checks return is_match; } 

कार्यात्मक रूप से, क्या इस तरह से मेरे कोड को संरचित करने में कोई कमी है? कंट्रोलर फंक्शन के शरीर के अंदर एक प्रोटोटाइप ऑब्जेक्ट को एक प्रोटोटाइप ऑब्जेक्ट जोड़ना होगा (यानी कन्स्ट्रक्टर फ़ंक्शन के एक्सपेंशन स्टेटमेंट बंद होने से पहले) अनपेक्षित स्कोपिंग के कारण हो सकते हैं?

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

Solutions Collecting From Web of "प्रोटोटाइप के तरीकों को असाइन करना * अंदर * कन्स्ट्रक्टर फ़ंक्शन – क्यों नहीं?"

कार्यात्मक रूप से, क्या इस तरह से मेरे कोड को संरचित करने में कोई कमी है? कंट्रोलर फंक्शन के शरीर के अंदर एक प्रोटोटाइप ऑब्जेक्ट को एक प्रोटोटाइप ऑब्जेक्ट जोड़ना होगा (यानी कन्स्ट्रक्टर फ़ंक्शन के एक्सपेंशन स्टेटमेंट बंद होने से पहले) अनपेक्षित स्कोपिंग के कारण हो सकते हैं?

हां, कमियां और अप्रत्याशित scoping समस्याएं हैं

  1. प्रोटोटाइप को स्थानीय रूप से परिभाषित फ़ंक्शन के ऊपर और दोनों को असाइन करना, दोनों को असाइनमेंट दोहराता है और हर बार एक नया फ़ंक्शन ऑब्जेक्ट बनाता है। पहले के कार्य को कचरा एकत्रित किया जाएगा क्योंकि वे अब संदर्भित नहीं हैं, लेकिन दूसरे कोड ब्लॉक की तुलना में कंसट्रैक्टर के क्रमबद्ध निष्पादन और कचरे संग्रहण के मामले में यह अनावश्यक काम है।

  2. कुछ परिस्थितियों में अनपेक्षित scoping मुद्दे हैं एक स्पष्ट उदाहरण के लिए मेरे उत्तर के अंत में Counter उदाहरण देखें यदि आप प्रोटोटाइप विधि से कन्स्ट्रक्टर के स्थानीय चर को संदर्भित करते हैं, तो आपका पहला उदाहरण आपके कोड में संभावित रूप से गंदा बग बनाता है।

कुछ अन्य (अधिक नाबालिग) मतभेद हैं आपकी पहली योजना में कन्स्ट्रक्टर के बाहर प्रोटोटाइप के इस्तेमाल की अनुमति नहीं है:

 Filter.prototype.checkProduct.apply(someFilterLikeObject, ...) 

और जाहिर है, अगर किसी ने प्रयोग किया है:

 Object.create(Filter.prototype) 

Filter कन्स्ट्रक्टर को चलाने के बिना, जो एक अलग परिणाम भी पैदा करेगा जो संभवत: संभव नहीं है क्योंकि अपेक्षा की जाने योग्य है कि अपेक्षाकृत परिणाम प्राप्त करने के लिए Filter प्रोटोटाइप का उपयोग करने वाले Filter निर्माता को चलाने चाहिए।


रन-टाइम प्रदर्शन बिंदु (ऑब्जेक्ट पर कॉलिंग विधियों का प्रदर्शन) से, आप इस के साथ बेहतर होगा:

 var Filter = function( category, value ){ this.category = category; this.value = value; // product is a JSON object this.checkProduct = function( product ){ // run some checks return is_match; } }; 

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


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

 var Counter = function(initialValue){ var value = initialValue; // product is a JSON object Counter.prototype.get = function() { return value++; } }; var c1 = new Counter(0); var c2 = new Counter(10); console.log(c1.get()); // outputs 10, should output 0 

समस्या का प्रदर्शन: http://jsfiddle.net/jfriend00/c7natr3d/

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

जबकि अन्य जवाबों में उन चीजों पर ध्यान केंद्रित किया गया है जो निर्माता के अंदर से प्रोटोटाइप को निर्दिष्ट करने में गलत हैं, मैं आपके पहले कथन पर ध्यान केन्द्रित करूंगा:

स्टाइलिस्टिक रूप से, मैं इस संरचना को पसंद करता हूं

संभवतया आप यह संकेत देते हैं कि इस संकेतन को साफ रूप से ढकेल दिया गया है – वर्ग से संबंधित सभी चीजों को {} ब्लॉक द्वारा ठीक से "स्कॉड" किया गया है (ज़ाहिर है, भ्रम यह है कि इसे कन्स्ट्रक्टर फ़ंक्शन के प्रत्येक रन के लिए स्कॉच किया गया है)।

मेरा सुझाव है कि आप (खुलासा) मॉड्यूल पैटर्न पर ले जाते हैं जो जावास्क्रिप्ट ऑफ़र करता है। आपको अधिक स्पष्ट संरचना, स्टैंडअलोन कन्स्ट्रक्टर घोषणा, क्लास स्कॉड निजी वैरिएबल और एक ब्लॉक में ठीक से समझाया गया सब कुछ मिलता है:

 var Filter = (function() { function Filter(category, value) { // the constructor this.category = category; this.value = value; } // product is a JSON object Filter.prototype.checkProduct = function(product) { // run some checks return is_match; }; return Filter; }()); 

पहला उदाहरण कोड प्रकार प्रोटोटाइप के उद्देश्य को याद करता है। आप प्रत्येक आवृत्ति के लिए जांच पुनः उत्पादित करेंगे। हालांकि इसे केवल प्रोटोटाइप पर परिभाषित किया जाएगा, और हर उदाहरण के लिए स्मृति का उपभोग नहीं करेगा, फिर भी यह समय लगेगा।

यदि आप वर्ग को समापित करना चाहते हैं तो आप चेक उत्पाद विधि से पहले ही विधि की मौजूदगी की जांच कर सकते हैं:

 if(!Filter.prototype.checkProduct) { Filter.prototype.checkProduct = function( product ){ // run some checks return is_match; } } 

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

आपके कोड का सबसे बड़ा नुकसान आपकी विधियों को ओवरराइड करने की संभावना बंद कर रहा है।

अगर मैं लिखता हूं:

 Filter.prototype.checkProduct = function( product ){ // run some checks return different_result; } var a = new Filter(p1,p2); a.checkProduct(product); 

परिणाम अपेक्षा से भिन्न होगा क्योंकि मूल समारोह को बुलाया जाएगा, न कि मेरी।

पहले उदाहरण में Filter प्रोटोटाइप फ़ंक्शन से भरा नहीं है, जब तक Filter को कम से कम एक बार लागू नहीं किया जाता है। क्या होगा अगर कोई व्यक्ति प्रोटोटाइप Filter करने का प्रयास करता है? या तो नोडजेज़ का इस्तेमाल करना '

 function ExtendedFilter() {}; util.inherit(ExtendedFilter, Filter); 

या Object.create :

 function ExtendedFilter() {}; ExtendedFilter.prototype = Object.create(Filter.prototype); 

हमेशा प्रोटोटाइप श्रृंखला में रिक्त प्रोटोटाइप के साथ समाप्त होता है अगर भूल गया या पहले Filter करने के लिए नहीं पता।

बस एफवाईआई, आप इसे सुरक्षित रूप से या तो नहीं कर सकते हैं:

  function Constr(){ const privateVar = 'this var is private'; this.__proto__.getPrivateVar = function(){ return privateVar; }; } 

इसका कारण यह है कि Constr.prototype === this.__proto__ , तो आप एक ही दुर्व्यवहार होगा।