अच्छी जावास्क्रिप्ट तकनीकों को लोकप्रिय बनाने के लिए क्रॉकफोर्ड ने बहुत कुछ किया है। भाषा के प्रमुख तत्वों के बारे में उनकी राय ने कई उपयोगी चर्चाओं को जन्म दिया है। उस ने कहा, बहुत से लोग हैं जो "बुरे" या "हानिकारक" के प्रत्येक उद्घोष को सुसमाचार के रूप में लेते हैं, एक व्यक्ति की राय से परे देखने से इनकार करते हैं। यह कई बार थोड़ा निराश कर सकता है।
new
कीवर्ड द्वारा प्रदान की गई कार्यक्षमता का उपयोग खरोंच से प्रत्येक वस्तु के निर्माण पर कई फायदे हैं:
- प्रोटोटाइप वंशानुक्रम । जबकि अक्सर क्लास-आधारित ओओ भाषाओं के आदी लोगों द्वारा संदेह और उपहास के मिश्रण के साथ देखा जाता है, जावास्क्रिप्ट की मूल विरासत तकनीक कोड री-यूज़ का एक सरल और आश्चर्यजनक प्रभावी साधन है। और नया कीवर्ड कैनोनिकल (और केवल उपलब्ध क्रॉस-प्लेटफॉर्म) इसका उपयोग करने का साधन है।
- प्रदर्शन। यह # 1 का एक साइड-इफ़ेक्ट है: यदि मैं अपने द्वारा बनाए गए प्रत्येक ऑब्जेक्ट में 10 विधियाँ जोड़ना चाहता हूँ, तो मैं केवल एक निर्माण फंक्शन लिख सकता हूँ जो प्रत्येक नए ऑब्जेक्ट को मैन्युअल रूप से असाइन करता है ... या, मैं उन्हें असाइन कर सकता हूँ निर्माण कार्य
prototype
और new
नई वस्तुओं पर मुहर लगाने के लिए उपयोग करें। न केवल यह तेज़ है (प्रोटोटाइप पर प्रत्येक और हर विधि के लिए आवश्यक कोई कोड नहीं है), यह प्रत्येक विधि के लिए अलग-अलग गुणों के साथ प्रत्येक वस्तु को गुब्बारा करने से बचता है। धीमी मशीन (या विशेष रूप से, धीमी जेएस दुभाषियों) पर जब कई ऑब्जेक्ट बनाए जा रहे हैं तो इसका मतलब समय और स्मृति में महत्वपूर्ण बचत हो सकती है।
और हां, new
इसका एक महत्वपूर्ण नुकसान है, अन्य उत्तरों द्वारा संक्षेप में वर्णित: यदि आप इसका उपयोग करना भूल जाते हैं, तो आपका कोड बिना चेतावनी के टूट जाएगा। सौभाग्य से, उस नुकसान को आसानी से कम कर दिया जाता है - बस फ़ंक्शन में थोड़ा सा कोड जोड़ें:
function foo()
{
// if user accidentally omits the new keyword, this will
// silently correct the problem...
if ( !(this instanceof foo) )
return new foo();
// constructor logic follows...
}
अब आप new
बिना गलती के दुरुपयोग के कारण होने वाली समस्याओं के बारे में चिंता किए बिना फायदे पा सकते हैं । अगर आप टूटे हुए कोड के बारे में चुपचाप काम कर रहे हैं, तो आपको इस बात पर ध्यान देने की ज़रूरत है कि आप जाँच कर सकते हैं। या, जैसा कि कुछ ने टिप्पणी की, रनटाइम अपवाद पेश करने के लिए चेक का उपयोग करें:
if ( !(this instanceof arguments.callee) )
throw new Error("Constructor called as a function");
(ध्यान दें कि यह स्निपेट कंस्ट्रक्टर फ़ंक्शन नाम की हार्ड-कोडिंग से बचने में सक्षम है, क्योंकि पिछले उदाहरण के विपरीत इसे वास्तव में ऑब्जेक्ट को तुरंत करने की कोई आवश्यकता नहीं है - इसलिए, इसे संशोधन के बिना प्रत्येक लक्ष्य फ़ंक्शन में कॉपी किया जा सकता है।)
जॉन रेसिग अपनी सरल "क्लास" इंस्टेंटेशन पोस्ट में इस तकनीक पर विस्तार से जाते हैं , साथ ही डिफ़ॉल्ट रूप से इस व्यवहार को आपके "वर्गों" में बनाने का एक साधन भी शामिल है। निश्चित रूप से लायक एक पढ़ें ... के रूप में अपनी आने वाली किताब है, जावास्क्रिप्ट निंजा का राज है, जो यह और कई अन्य "हानिकारक" में सोने छिपा मिलते जावास्क्रिप्ट भाषा की विशेषताएं ( अध्याय पर with
विशेष रूप से हम में से उन लोगों के लिए ज्ञानवर्धक है जो शुरू में खारिज कर दिया एक नौटंकी के रूप में यह बहुत बदनाम विशेषता)।