2011-11-28 16 views
9

मैं जावास्क्रिप्ट सीख रहा हूं, मैं लगभग 10 वर्षों तक PHP का उपयोग कर रहा हूं, इसलिए मुझे जावास्क्रिप्ट का कुछ ज्ञान है, ज्यादातर jQuery का उपयोग करके और इसे एक साथ हैक करना, मुझे लगता है कि यह समय है कि मैंने इसे बेहतर सीखने में कुछ प्रयास किया इसलिए मैं इसे पढ़ रहा हूं।जावास्क्रिप्ट फ़ंक्शंस और ऑब्जेक्ट्स

नीचे कुछ कार्यों को परिभाषित करने और कॉल करने के मेरे उदाहरण नीचे दिए गए हैं।

विधि 1

function testFunction1() { 
    console.log('TestFunction1() was ran'); 
} 
testFunction1(); 

विधि 2

var testFunction2 = function() { 
    console.log('TestFunction2() was ran'); 
} 
testFunction2(); 

विधि 3

var TestFunction3 = { 
    flag: function() { 
     console.log('TestFunction3.flag() was ran'); 
    }, 
    unflag: function() { 
     console.log('TestFunction3.unflag() was ran'); 
    } 
}; 
TestFunction3.flag(); 
TestFunction3.unflag(); 

विधि 4

var TestFunction4 = { 
    Like: { 
     comment: function() { 
      console.log('TestFunction4.Like.comment() was ran'); 
     }, 
     user: function() { 
      console.log('TestFunction4.Like.user() was ran'); 
     } 
    }, 
    Unlike: { 
     comment: function() { 
      console.log('TestFunction4.Unlike.comment() was ran'); 
     }, 
     user: function() { 
      console.log('TestFunction4.Unlike.user() was ran'); 
     } 
    } 
}; 
TestFunction4.Like.comment(); 
TestFunction4.Like.user(); 
TestFunction4.Unlike.comment(); 
TestFunction4.Unlike.user(); 

ठीक है तो मैं समझता हूँ कि विधि 1 और 2 सिर्फ एक बुनियादी कार्य कॉल किया जाना है।

1)
विधि 3 और 4 जहां मेरे प्रश्न अन्य पोस्ट से और पढ़ने से शुरू होते हैं, मैं यह नहीं बता सकता कि इन्हें अभी भी नेमस्पेसिंग के साथ मूलभूत कार्य माना जाता है, या यदि इन्हें ऑब्जेक्ट माना जाएगा?

2)
मैंने देखा है जहां कभी कभी एक वस्तु तथापि ब्राउज़र में यह सब चल रहा new शब्द के साथ कहा जा सकता है ठीक काम करता है तो मैं इस एक वस्तु नहीं है अनुमान लगा रहा हूँ? यदि यह कोई वस्तु नहीं है, तो मैं इसे किसी ऑब्जेक्ट में कैसे बनाऊंगा?

3)
उदाहरण 3 और 4 काफी अपवाद के साथ एक ही है कि उदाहरण के 4 कार्यों उदाहरण के लिए 3 तो 1 स्तर गहरी परिभाषित किया गया है कर रहे हैं, वहाँ उदाहरण 3 और 4 के लिए एक नाम है या वे एक ही बात माना जाता है?

4)
आखिरकार सभी 4 उदाहरणों में से, क्या इनमें से कोई भी 4 तरीकों से पसंदीदा है?

1 में सभी प्रश्नों के लिए खेद है, लेकिन वे सभी संबंधित हैं और मुझे नहीं लगता कि मुझे इसके लिए 4 अलग-अलग प्रश्न शुरू करने होंगे।

+0

आप शायद पढ़ने से लाभ होगा: http://bonsaiden.github.com/JavaScript-Garden/ और कम से कम [ECMAScript मानक] (http की समीक्षा: //www.ecma-international.org/publications/standards/Ecma-262.htm)। –

+1

सब कुछ एक वस्तु है, 'शून्य' और 'अपरिभाषित' को छोड़कर। – zzzzBov

+1

यदि आपके पास कुछ खाली समय है तो डगलस क्रॉकफ़ोर्ड द्वारा [द गुड पार्ट्स] (http://www.amazon.com/exec/obidos/ASIN/0596517742/wrrrldwideweb) पर एक नज़र डालें। अपेक्षाकृत छोटी किताब, इसे पढ़ने के बाद आपके प्रश्नों का उत्तर स्पष्ट होना चाहिए। – Jeroen

उत्तर

4

3 एक वस्तु है। इसमें ऑब्जेक्ट गुण हैं, जिनके पास गुण हैं जो कार्य हैं। 4 एक ही विचार है, बस कम घोंसले के साथ।

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

यदि आप एक कन्स्ट्रक्टर के रूप में फ़ंक्शन का उपयोग करना चाहते हैं, तो आप इसे सम्मेलन द्वारा पूंजी पत्र से शुरू करेंगे, फिर इसे new कीवर्ड से कॉल करें। यह ऑब्जेक्ट.प्रोटोटाइप के आधार पर एक खाली वस्तु बनाता है, और इसे this के बराबर सेट करता है। आप this करने के लिए उन्हें सीधे जोड़कर अपने जिसके परिणामस्वरूप ऑब्जेक्ट में गुण जोड़ते हैं वह ऑब्जेक्ट निर्माण के इस मोड का उपयोग कर, यानी उस वस्तु की this.foo = 12

तरीके अपने समारोह के प्रोटोटाइप को संशोधित करके जोड़ा जाएगा।

YourConstrutor.prototype.newMethod = function() { 
    alert(this.foo); 
}; 

ध्यान दें कि कंस्ट्रक्टर्स का उपयोग कर कठिनाइयों का एक बहुत के साथ आता है, आप विरासत लागू करना चाहते हैं, खासकर अगर

वस्तुओं अधिक बस उन्हें एक "नियमित" समारोह से लौट रहे द्वारा बनाया जा सकता:

function createCar() { 
    return { 
     prop1 : 12, 
     someFunc: function() { 
     alert(this.prop1); 
     } 
    } 
} 

यह भी आसान छुपा जानकारी है:

function createCar() { 
    var protectedInfo = "haha I'm protected"; ///not visible outside this function 
    return { 
     prop1 : 12, 
     showProtectedData: function() { 
     alert(protectedInfo); 
     }, 
     someFunc: function() { 
     alert(this.prop1); 
     } 
    } 
} 

(आप कंस्ट्रक्टर्स साथ भी छुपा जानकारी लागू कर सकते हैं, लेकिन संरक्षित जानकारी तरीकों आप प्रोटोटाइप पर डाल को दिखाई नहीं हो जाएगा; संरक्षित जानकारी केवल आप this को मैन्युअल रूप से जोड़) तरीकों को दिखाई देगी,

यहाँ केवल नुकसान यह है कि निर्माण, थोड़ा धीमी हो जाएगा, क्योंकि यह बनाने है कि someFunc विधि नए सिरे से हर बार; एक कन्स्ट्रक्टर के साथ प्रोटोटाइप के हिस्से के रूप में यह एक बार मौजूद होगा।

4. कौन सा बेहतर है? यदि आप सिर्फ एक वस्तु बनाना चाहते हैं, तो 3 या 4 का उपयोग करें। सरल।

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

1
  1. 3 और 4 अभी भी कार्यरत हैं, लेकिन वे ऑब्जेक्ट भी हैं। 1 और 2 वस्तुओं के साथ-साथ कार्य भी हैं। सभी फ़ंक्शन ऑब्जेक्ट्स हैं - जावास्क्रिप्ट में प्रथम श्रेणी के फ़ंक्शन हैं।

  2. यह एक वस्तु को दर्शाता है। new के साथ बुलाए जाने वाले कार्यों कन्स्ट्रक्टर हैं। वे वस्तुओं को बनाते हैं।

  3. वे सटीक एक ही बात कर रहे हैं। # 1 में की तरह, नेस्टिंग स्तर क्योंकि वे सब बराबर कर रहे हैं, कुछ भी के प्रकार पर कोई प्रभाव नहीं ...

  4. नहीं है। Function एक Object है और इससे कोई फर्क नहीं पड़ता कि यह कहां है। आम तौर पर, हालांकि, आप नेमस्पेस के उद्देश्य के लिए भारी घोंसले से बचेंगे क्योंकि यह आपके कोड को धीमा कर सकता है, बिना किसी स्पष्टता लाभ के। जावास्क्रिप्ट वास्तव में नामस्थानों के साथ दिमाग में डिजाइन नहीं किया गया था।

0

AFAIK

1) जे एस में सभी कार्यों वस्तुओं रहे हैं। 3 के मामले में, हां इसे एक ऑब्जेक्ट के रूप में माना जाएगा क्योंकि यह घुंघराले ब्रेसिज़ के अंदर है

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

4) शायद 4 मैं क्या लगता है कि आप चाहते हैं के सबसे करीब है और कुछ समझदार दृष्टिकोण इस प्रकार है लेकिन एंड्रयू कहते हैं, मैं कुछ इस तरह में 4 को बदलने के लिए इच्छुक हो जाएगा:

var TestFunction4 = (function(){ 
    return { 
     flag: function() { 
      console.log('TestFunction4.flag() was ran'); 
     }, 
     unflag: function() { 
      console.log('TestFunction4.unflag() was ran'); 
     } 
    } 
})(); 
TestFunction4.flag(); 
TestFunction4.unflag(); 

नोट पर कोष्टक विधि की पूंछ, तुरंत अमल और खुद तो उपलब्ध अनुप्रयोग के आराम करने के क्रम से पहले बनाने के लिए समारोह के लिए मजबूर (माना के संदर्भ में, IntelliSense)

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

यह मैं कैसे प्रयोग करेंगे 'है प्रतिक्रिया में निजी 'कार्यों टी ओ टिप्पणी 'क्यों आप इस करना होगा':

var TestFunction4 = (function(){ 
    //private function 
    var private = { 
     aPrivateFunction: function(a) { 
      return a + 1; 
     } 
    } 
    //public return object 
    var public = { 
     flag: function() { 
      console.log('Calling private function aPrivateFunction(10) expecting 11'); 
      console.log('result' + private.aPrivateFunction(10)); 
      console.log('TestFunction4.flag() was ran'); 
     }, 
     unflag: function() { 
      console.log('TestFunction4.unflag() was ran'); 
     } 
    } 
    //return things to expost publicly 
    return public; 
})(); 
+0

आपका 4) उदाहरण भी नहीं चलता है ... और आप ऐसा क्यों करेंगे? 'कार्य की वस्तुओं को आसानी से ओवरराइट किया जा सकता है। – Ryan

+0

उपर्युक्त उदाहरण पूरी तरह से एक उदाहरण था, इसे चलाने के लिए आपको किसी ऑब्जेक्ट या संपत्ति को 'वापसी' करने की आवश्यकता होगी, जिसमें फ्लैग और अनलाह फ़ंक्शंस शामिल हैं, जैसा कि मैंने 3 बिंदु के उत्तर में बताया है, मैं यह दिखाने के लिए कोड अपडेट करूंगा कि आप कैसे इसे – dougajmcdonald

+0

चलाएगा 'आप ऐसा क्यों करना चाहते हैं' के जवाब में यह मॉड्यूलरिसेशन के लिए एक पूर्व-कर्सर है। एक बार जब आप उन कार्यों के ऑब्जेक्ट को वापस कर रहे हैं जिन्हें आप सुलभ करना चाहते हैं, तो आप TestFunction4 ऑब्जेक्ट के अंदर 'निजी' फ़ंक्शंस/वर्र्स को परिभाषित कर सकते हैं जो लौटे ऑब्जेक्ट का हिस्सा नहीं हैं। जबकि TestFunction4 को ओवरराइड किया जा सकता है, अंदर के मूल्य AFAIK तक पहुंचा नहीं जा सका। मैं उस उदाहरण के लिए कार्रवाई में इसे दिखाने के लिए फ़ंक्शन को फिर से अपडेट करूंगा जो आप चला सकते हैं। – dougajmcdonald

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