2010-05-17 7 views
6

मैंने जॉन रेसिग की Best Practices in JavaScript Library Design प्रस्तुति देखी; एक स्लाइड ने ऑब्जेक्ट कन्स्ट्रक्टर को "ट्वीविंग" का सुझाव दिया ताकि यह स्वयं को तुरंत चालू कर सके।कन्स्ट्रक्टर के भीतर नया या खराब लपेट रहा है?

function jQuery(str, con) { 
    if (window === this) { 
     return new jQuery(str, con); 
    } 
    // ... 
} 

कि के साथ, new jQuery("#foo")jQuery("#foo") हो जाता है।

मैंने सोचा कि यह दिलचस्प था, लेकिन मैंने अपने कोड में ऐसे निर्माता को नहीं लिखा है।

थोड़ी देर बाद मैंने एसओ पर एक पोस्ट पढ़ी। (क्षमा करें, मुझे याद नहीं है कि मैं कौन सा लिंक दूंगा या मैं एक लिंक दूंगा। अगर मैं इसे फिर से पा सकता हूं तो मैं सवाल अपडेट कर दूंगा।) टिप्पणियों में से एक ने कहा कि प्रोग्रामर से new को छिपाने का बुरा अभ्यास था, लेकिन नहीं विवरण में नहीं जाना है।

मेरा सवाल यह है कि उपरोक्त आम तौर पर अच्छा, बुरा, या उदासीन माना जाता है, और क्यों?

उत्तर

5

यह है, जब लोग भूल जाते हैं के लिए एक रक्षात्मक तकनीक है 'वर्ग' फ़ंक्शन के सामने new ऑपरेटर का उपयोग करने के लिए।
तर्क यह है कि यदि फ़ंक्शन को new के बिना बुलाया जाता है, तो वैश्विक दायरा अभी भी मौजूदा दायरे (नए उदाहरणों के बजाय) होगा, और इसलिए हम new ऑपरेटर का उपयोग करके उसी फ़ंक्शन को कॉल करते हैं।

लेकिन यदि आप मुझसे पूछें, तो सही चीज एक त्रुटि फेंकना होगा और वास्तव में डेवलपर को यह पता होना चाहिए कि उसने इसे 'स्वीकार करने' के बजाय गलती की है।

लेकिन हे, मुझे लगता है कि यह jQuery मंत्र के अनुसार है:
'उपयोगकर्ताओं को गुणवत्ता कोड लिखने में सक्षम बनाने के बजाय, उन्हें अजीब और अमान्य कोड लिखने के लिए सक्षम/मजबूर करें।

1

आप किसी फ़ंक्शन से ऑब्जेक्ट लौट रहे हैं। मुझे उसमें कोई समस्या नहीं है।

यह कर के रूप में ही है:

function getObject(){ return new SomeObject; } 

फर्क सिर्फ इतना है कि आप वास्तव में अपने आप को लौट रहे हैं है। लेकिन, अगर आप इसे स्पष्ट रूप से दस्तावेज करते हैं तो यह वास्तव में भ्रामक प्रतीत नहीं होता है। जो लोग jQuery में उपयोग किए जाते हैं वे शायद बढ़ी उपयोगिता के लिए आपकी प्रशंसा करेंगे।

4

आईएमओ मुझे लगता है कि यह एक व्यावहारिक और पूरी तरह से वैध रक्षात्मक तकनीक है।

आप एक constructor function, सुनिश्चित करें के लिए आप नव निर्मित वस्तु दृष्टान्त (this) का उपयोग करना चाहते का निर्माण कर रहे हैं, तो और कुछ भी नहीं अच्छा अगर this अंक वैश्विक वस्तु का क्या होगा।

भविष्य में

सौभाग्य से, सख्त मोड पर ECMAScript 5 संस्करण, this बस undefined में शामिल होंगे जब एक समारोह कोई आधार वस्तु है और न ही new ऑपरेटर के साथ कहा जाता है में ...

यह भी देखें:

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