ऑब्जेक्ट ओरिएंटेड जावास्क्रिप्ट बेस्ट प्रैक्टिस? [बन्द है]


251

मैं खुद को जावास्क्रिप्ट में एक बड़ी परियोजना कोडिंग पा रहा हूं। मुझे याद है कि आखिरी काफी साहसिक था क्योंकि हैसी जेएस जल्दी से अपठनीय हो सकता है और मैं चाहता हूं कि यह कोड साफ हो।

ठीक है, मैं वस्तुओं का उपयोग करने के लिए एक काम का निर्माण कर रहा हूं, लेकिन जेएस में चीजों को परिभाषित करने के कई तरीके हैं, गुंजाइश में महत्वपूर्ण परिणाम, स्मृति प्रबंधन, नाम स्थान, आदि जैसे।

  • उपयोग करना varया न करना;
  • फ़ाइल में चीजों को परिभाषित करना, या (function(){...})()कबाड़ शैली में;
  • का उपयोग कर this, या नहीं;
  • का उपयोग कर function myname()या myname = function();
  • ऑब्जेक्ट के शरीर में परिभाषित करने या "प्रोटोटाइप" का उपयोग करने के तरीके;
  • आदि।

तो क्या वास्तव में सबसे अच्छा अभ्यास कर रहे हैं जब जेएस में OO कोडिंग?

अकादमिक स्पष्टीकरण वास्तव में यहाँ की उम्मीद है। जब तक वे गुणवत्ता और मजबूती के साथ व्यवहार करते हैं, तब तक पुस्तकों का गर्मजोशी से स्वागत करते हैं।

संपादित करें:

कुछ रीडिंग मिलीं, लेकिन मैं अभी भी उपरोक्त प्रश्नों और किसी भी सर्वोत्तम अभ्यास के उत्तर में बहुत दिलचस्पी रखता हूं।


2
हो सकता है कि शीर्षक में "ऑब्जेक्ट ओरिएंटेड" को "आधुनिक" में बदल दिया जाए।
viam0Zah

43
हम्म, 79 upvotes, 82 favs, 91 उत्तोलन जवाब पर ... फिर भी यह बंद किया गया था के रूप में निर्माण नहीं ... ??
ब्रेट रॉसियर

1
मैंने एक सरल और प्राकृतिक वाक्यविन्यास के साथ जावास्क्रिप्ट में सी ++ ओओपी फीचर्स को चित्रित करते हुए एक साधारण वर्ग लिखा। मेरा जवाब यहां देखें: stackoverflow.com/a/18239463/1115652

14
इस प्रकार का प्रश्न हमेशा बंद रहता है। मैं इसके कारणों को समझता हूं, लेकिन जैसा कि वे महत्वपूर्ण प्रश्न हैं, और हमेशा लोकप्रिय हैं (और जब से मैं हमेशा उन्हें पाता हूं जब मेरे पास एक समान प्रश्न होता है), तो मुझे आश्चर्य होता है कि क्या कोई हमें उनसे पूछने के लिए उचित स्थान पर निर्देशित कर सकता है?
केपी मैकग्रेगर

2
@BrettRossier क्या अच्छा है यदि आप इसे नहीं मिटाते हैं? एसओ एक डेमोक्रेटिक पेकिंग ऑर्डर कैसे काम करता है इसका लाइव प्रदर्शन है। निश्चित रूप से कुछ मनोवैज्ञानिक इसे देख रहे हैं ...

जवाबों:


288

`Var` या नहीं का उपयोग करना

आपको varबयान के साथ किसी भी चर का परिचय देना चाहिए , अन्यथा यह वैश्विक दायरे में आता है।

यह ध्यान देने योग्य है कि सख्त मोड में ( "use strict";) अघोषित चर असाइनमेंट फेंकता हैReferenceError

वर्तमान में जावास्क्रिप्ट में ब्लॉक स्कोप नहीं है। क्रॉकफोर्ड स्कूल आपको फ़ंक्शन बॉडी की शुरुआत में वेरिएंट स्टेटमेंट देना सिखाता है , जबकि डोज़ो की स्टाइल गाइड पढ़ती है कि सभी वेरिएबल्स को सबसे कम दायरे में घोषित किया जाना चाहिए । ( जावास्क्रिप्ट 1.7 में प्रस्तुत letविवरण और परिभाषा ECMAScript मानक का हिस्सा नहीं है।)

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

फ़ाइल में चीजों को परिभाषित करना, या एक `(फ़ंक्शन () {...}) ()` में

यदि आपको अपने कोड के बाहर अपनी वस्तुओं तक पहुँचने की आवश्यकता नहीं है, तो आप अपने पूरे कोड को एक फंक्शन एक्सप्रेशन में लपेट सकते हैं — इसे मॉड्यूल पैटर्न कहते हैं। इसके प्रदर्शन लाभ हैं, और यह आपके कोड को उच्च स्तर पर खनन और अस्पष्ट करने की अनुमति देता है। आप यह भी सुनिश्चित कर सकते हैं कि यह वैश्विक नामस्थान को प्रदूषित नहीं करेगा। जावास्क्रिप्ट में रैपिंग फ़ंक्शंस भी आपको पहलू-उन्मुख व्यवहार को जोड़ने की अनुमति देता है। बेन चेरी का मॉड्यूल पैटर्न पर एक गहन लेख है

`यह` या नहीं का उपयोग करना

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

`Function myname ()` या `myname = function ();` का उपयोग करना

function myname()एक फंक्शन डिक्लेरेशन है और myname = function();वेरिएबल को असाइन किया गया फंक्शन एक्सप्रेशन है myname। बाद का रूप इंगित करता है कि फ़ंक्शंस प्रथम श्रेणी के ऑब्जेक्ट हैं, और आप उनके साथ कुछ भी कर सकते हैं, जैसे कि एक चर के साथ। उनके बीच एकमात्र अंतर यह है कि सभी फ़ंक्शन घोषणाओं को दायरे के शीर्ष पर फहराया जाता है, जो कुछ मामलों में हो सकता है। अन्यथा वे समान हैं। function foo()शॉर्टहैंड रूप है। उत्थापन के बारे में अधिक जानकारी जावास्क्रिप्ट स्कोपिंग और उत्थापन लेख में पाई जा सकती है ।

वस्तु के शरीर में परिभाषित करने के तरीके या "प्रोटोटाइप" का उपयोग करना

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

फ़्रेमवर्क

मेरा सुझाव है कि आप कुछ जावास्क्रिप्ट फ्रेमवर्क चुनें, उनके सम्मेलनों और शैली का अध्ययन करें, और उन प्रथाओं और पैटर्नों को खोजें जो आपके लिए सबसे उपयुक्त हैं। उदाहरण के लिए, डोजो टूलकिट ऑब्जेक्ट-ओरिएंटेड जावास्क्रिप्ट कोड लिखने के लिए एक मजबूत ढांचा प्रदान करता है जो कि कई विरासत का समर्थन करता है।

पैटर्न्स

अंत में, सामान्य जावास्क्रिप्ट पैटर्न और विरोधी पैटर्न का पता लगाने के लिए समर्पित एक ब्लॉग है । यह भी देखें कि क्या जावास्क्रिप्ट के लिए कोई कोडिंग मानक हैं? स्टैक ओवरफ्लो में।


1
"जावास्क्रिप्ट में चार ऑब्जेक्ट-निर्माण पैटर्न हैं: छद्म-शास्त्रीय, प्रोटोटाइप, कार्यात्मक और भाग" - मैं वास्तव में यहां पेशेवरों और विपक्षों के सारांश की सराहना करूंगा।
BadHorsie

2
" letजावास्क्रिप्ट 1.7 में प्रस्तुत विवरण और परिभाषा ईसीएमएस्क्रिप्ट मानक का हिस्सा नहीं है।" अब यह ES6 का हिस्सा है।
मिशैल पेरोलाकोव्स्की

13

जब से मैंने यह प्रश्न पूछा है, मैं कुछ सामानों को लिखने जा रहा हूं जो मैंने पढ़ा या आवेदन में रखा है। इसलिए इसे पढ़ने वाले लोग निराश नहीं होंगे, क्योंकि ज्यादातर जवाब आरटीएमएफ के भेस में होते हैं (भले ही मुझे मानना ​​पड़े, सुझाव दिया किताबें अच्छी हैं)।

वार उपयोग

किसी भी चर को पहले ही JS में उच्च दायरे में घोषित किया जाना चाहिए। इसलिए जब भी आप एक नया चर चाहते हैं, तो इसे बिना किसी वैश्विक संस्करण में हेरफेर करने जैसे बुरे आश्चर्य से बचने के लिए घोषित करें। इसलिए हमेशा var कीवर्ड का इस्तेमाल करें।

किसी ऑब्जेक्ट मेक में, वैरिएबल को निजी बनाएं। यदि आप सिर्फ एक सार्वजनिक चर घोषित करना चाहते हैं, this.my_var = my_valueतो ऐसा करने के लिए उपयोग करें।

घोषणा करने की विधियाँ

जेएस में, वे तरीकों की घोषणा करने के कई तरीके हैं। OO प्रोग्रामर के लिए, सबसे प्राकृतिक और अभी तक कुशल तरीका निम्नलिखित सिंटैक्स का उपयोग करना है:

वस्तु शरीर के अंदर

this.methodName = function(param) {

/* bla */

};

एक खामी है: आंतरिक फ़ंक्शन अजीब जेएस गुंजाइश के कारण "इसे" तक नहीं पहुंच पाएंगे। डगलस क्रॉकफ़ोर्ड ने "उस" नामक एक पारंपरिक स्थानीय चर का उपयोग करके इस सीमा को बायपास करने की सिफारिश की है। तो बन जाता है

function MyObject() {

    var that = this;

    this.myMethod = function() {

        jQuery.doSomethingCrazy(that.callbackMethod);

    };

};

लाइन के स्वचालित अंत पर भरोसा न करें

;यदि आप इसे भूल जाते हैं तो JS स्वचालित रूप से पंक्ति के अंत में जोड़ने का प्रयास करता है । इस व्यवहार पर भरोसा न करें, क्योंकि आपको त्रुटियां मिलेंगी जो डीबग करने के लिए एक गड़बड़ हैं।


8

पहले के बारे में पढ़ा जाना चाहिए प्रोटोटाइप-आधारित प्रोग्रामिंग तो आप जानते हैं कि जानवर की तरह आप के साथ काम कर रहे हैं और फिर पर एक नज़र डालें MDC पर जावास्क्रिप्ट स्टाइल गाइड और MDC पर जावास्क्रिप्ट पेज । मैं भी एक उपकरण के साथ कोड की गुणवत्ता को मजबूर करने के लिए सबसे अच्छा लगता है, यानी। जावास्क्रिप्ट लिंट या अन्य प्रकार।

OO के साथ सर्वोत्तम अभ्यास अधिक लगता है जैसे आप कोड गुणवत्ता पर ध्यान केंद्रित करने की तुलना में पैटर्न ढूंढना चाहते हैं, इसलिए Google खोज: जावास्क्रिप्ट पैटर्न और jQuery पैटर्न देखें


5

आप जॉन रेजिग (jQuery) द्वारा जावास्क्रिप्ट निंजा के रहस्य की जांच करना चाह सकते हैं । "इस पुस्तक का उद्देश्य एक मध्यवर्ती जावास्क्रिप्ट डेवलपर लेना है और उसे ज्ञान प्रदान करना है जिसे उसे क्रॉस-ब्राउज़र जावास्क्रिप्ट लाइब्रेरी बनाने की आवश्यकता है, जमीन से, ऊपर।"

मसौदा प्रकाशक के माध्यम से उपलब्ध है: http://www.manning.com/resig/

डगलस क्रॉकफोर्ड के पास अपने होमपेज पर कुछ अच्छे जावास्क्रिप्ट लेख भी हैं: http://www.crockford.com/


5

मैं अक्सर यहाँ एक ही आदमी की तरह महसूस करता हूँ जो मेरी जावास्क्रिप्ट के लिए मूट्स का उपयोग करता है।

यह M y O bject O riented Tools, mootools के लिए है।

मैं वास्तव में जावास्क्रिप्ट में OOP पर उनका लेना पसंद करता हूं। आप jquery के साथ-साथ उनके वर्ग कार्यान्वयन का भी उपयोग कर सकते हैं, इसलिए आपको jquery को नहीं खोना होगा (हालाँकि मटोल यह सब भी करता है)।

वैसे भी, पहले लिंक को एक अच्छा पढ़ें और देखें कि आप क्या सोचते हैं, दूसरी कड़ी मूटोल डॉक्स है।

MooTools और वंशानुक्रम

मूषक वर्ग


मैं एक भाषा को मोड़ने की कोशिश नहीं कर रहा हूं ताकि आप इसे फिट कर सकें कि पुरानी हैबिट एक अच्छी चीज है। यह C के इस तरह के लोग हैं, # का उपयोग करने के लिए इसे फोरट्रान की तरह दिखता है, वरना। मुझे लगता है कि आपको भाषा के काम करने के तरीके (और इसके सर्वोत्तम अभ्यासों को सीखने की कोशिश करनी चाहिए, और इसका उपयोग उस तरीके से करना चाहिए जो आपको बहुत ज्यादा परेशान नहीं करता है। लेकिन इसे सच में न बदलें।
e-satis

2
मुझे लगता है कि MooTools ऑब्जेक्ट सिस्टम काफी सुरुचिपूर्ण है और वास्तव में मुझे अपने कोड को व्यवस्थित / संक्षिप्त रखने में मदद करता है।
awesomo

0

धन्यवाद, लेकिन मैं आधार की तलाश नहीं कर रहा हूं। मैं जेएस को चलाने योग्य (गंदा) कर सकता हूं। या कम से कम अधिकांश समय :-) मुझे समान कोड लिखने के लिए मार्गदर्शन की आवश्यकता है, लेकिन ठीक से।
ई-सतीस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.