2011-03-01 22 views
9

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

मेरे बुनियादी धारणा है कि यह वस्तुओं को बदलने के लिए संभव है:

> var x = {'n': 2}; 
> x['n'] 
2 
> x['n'] = 3; 
3 

pheww कि काम किया। लेकिन फिर भी (कार्य वस्तुएं भी हैं):

> var addn = function(a) { 
    var n = 2; 
    return n + a; 
} 

> addn(3); 
5 
> addn['n'] = 3; 
3 
> addn(3); 
5 

इस बार मैं 'एन' को बदलने में सक्षम नहीं था। कार्यात्मक स्वाद को बनाए रखते हुए इसे ठीक करने का कोई तरीका है? पूरी तरह से ओओ जाने के विरोध में। एक संबंधित प्रश्न यह है कि उदाहरण के परीक्षण के उद्देश्य से कार्यों की निर्भरताओं को बनाए रखने के लिए कैसे होगा - फिर से ओओ जा रहा है? कारण मैं एक समाधान की तलाश में हूं लेकिन यदि संभव हो तो मैं यह भी समझना चाहूंगा कि जावास्क्रिप्ट में कौन सी तंत्र मुझे संघर्ष कर रही है।

चीयर्स,

मार्क

अस्वीकरण: OO उल्लेख करके मैं OO के खिलाफ कुछ भी कहने के लिए आशय नहीं है। और मैं VI या Emacs के खिलाफ कुछ भी कहना नहीं चाहता हूं। अगर मैं आपकी भावनाओं को किसी तरह चोट पहुंचाता हूं तो कृपया इसे छोड़ दें।

+1

आप हमेशा पैरामीटर के रूप में एन में पास हो सकते हैं, लेकिन मुझे लगता है कि आप जो पूछ रहे हैं वह नहीं है। – Orbit

+2

_ का मतलब क्या है "इस बार मैं 'n' _ _ _ बदलने में सक्षम नहीं था? क्या 'addn' 'n'] 'वापसी' 3' है? –

+0

आपकी ओओ टिप्पणियों के संबंध में: आप * ओओओ को फिर से शुरू करने की कोशिश कर रहे हैं, जो जावास्क्रिप्ट में भी पर्याप्त से अधिक किया गया है। ;) –

उत्तर

5

अगर मैं आपके सवाल का सही ढंग से समझ, आप एक नाम आपकी अनाम कार्य करने के लिए समारोह ऑब्जेक्ट के गुणों के माध्यम से देने के लिए और उपयोग कर सकते हैं:

var addn = function func(a) { 
    return func.n + a; 
}; 

addn['n'] = 3; 
addn(3); // returns 6 
+0

आप किसी अज्ञात फ़ंक्शन पर एक ही संपत्ति तक पहुंच सकते हैं, इसे बिना किसी संदर्भ में माता-पिता में संलग्न करके संदर्भित किया जा सकता है। '(फ़ंक्शन() {}) प्रोटोटाइप' –

2

वस्तु गुण और स्थानीय चर काफी हद तक संबंधित नहीं हैं:

  • var n एक चर है कि समारोह क्या है के दायरे वाला वाणी (यानी यह नहीं है कि समारोह के दृश्य के बाहर (बंद के माध्यम से छोड़कर) है)।

  • addn['n']addn में कोई प्रॉपर्टी n नामित जोड़ता है और एक समारोह दायरे में addn.n

14

निजी चर के बराबर है, और किसी वस्तु की संपत्ति 2 बहुत अलग बातें हैं। उस फ़ंक्शन के अंदर var n उस फ़ंक्शन के बाहर से पूरी तरह से पहुंच योग्य नहीं है।

तो कोड के बाद, addn.n == 3 चलाता है, लेकिन var n पर सेट किया गया अलग-अलग मान हर बार funciton चलाता है। जावास्क्रिप्ट के quirks के कारण, एक फ़ंक्शन वास्तव में अपने गुणों को बहुत आसान नहीं पहुंच सकता है। इसके बजाय यह पैटर्न function(n, a)

या किसी समान चीज़ को प्राप्त करने के लिए किसी ऑब्जेक्ट का उपयोग करके बेहतर हासिल किया जाएगा।

var adder = { 
    n: 0, 
    addn: function(a) { 
    return this.n + a; 
    } 
}; 

adder.n = 5; 
adder.addn(2); // 7 
1

के बाद से जावास्क्रिप्ट समारोह गुंजाइश है, तो आप ऐसा तरह n के मूल्य स्टोर करने के लिए एक समारोह का उपयोग कर सकते हैं:

var addn = (function(n) { 
    return function(x) { 
    n += x; 
    return n; 
    } 
}(2); 

addn(3) // 5 
addn(3) // 8 
1

यह जावास्क्रिप्ट में "वस्तुओं" के पारंपरिक OO अवधारणा के बारे में पूरी तरह से भूल जाते हैं सबसे अच्छा है -लैंड, और बंद होने के मामले में इसके बजाय सोचने के लिए। मैं दृढ़ता से jQuery के निर्माता जॉन रेजिग द्वारा this tutorial पढ़ने की सलाह देता हूं।

+0

: ' var num = 10; फ़ंक्शन addNum (myNum) { वापसी संख्या + myNum; } num = 15; जोर दें (addNum (5) == 20, "एक साथ दो संख्याएं जोड़ें, एक बंद होने से।"); ' मुझे लगता है कि यह एक दृष्टिकोण है लेकिन एक चीज है जो मुझे पसंद नहीं है कि 'num' अब 'addn' ऑब्जेक्ट का हिस्सा नहीं है। – mark

0

असल में, जावास्क्रिप्ट में कुछ एक ऑब्जेक्ट है। यदि आप

var a=3; 
a['n']=4; 

संदर्भ से कहा 'एक' अभी भी 3 वापसी होगी, लेकिन एक भी एक सदस्य है 'एन' जो मूल्य 4. है तो जब आप कहते हैं कि addn['n'] = 3 आप addn एक नए सदस्य को जोड़ रहे हैं, और नहीं किसी भी तरह से समारोह को प्रभावित करना।

मैं दृढ़ता से पढ़ने की सिफारिश करता हूं How good c habits can encourage bad javascript habits. उन सभी चीजों का वर्णन करने में जो आप गलत कर सकते हैं, यह जावास्क्रिप्ट में ऑब्जेक्ट्स के काम के तरीके के बारे में एक महान परिचय है।

0

सबसे पहले, आप ऐसा करके समारोह चर नहीं बदल रहे हैं:

addn [ 'एन'] = 3;

आपके द्वारा परिभाषित फ़ंक्शन में कोई नाम नहीं है (जिसे "अज्ञात फ़ंक्शन" भी कहा जाता है)। आप बस असाइन कर रहे हैं जो addn नामक चर पर कार्य करता है। एक चर में कोई संपत्ति नहीं होती है - यह केवल एक कंटेनर है (जब तक वेरिएबल एक सरणी को संदर्भित नहीं करता)। तो addn['n'] कुछ भी नहीं देता है।

उपयोगकर्ता casablanca बताया गया है, आप नामfunc और फिर पहुँच के रूप में अपने समारोह (और संशोधित) कर सकते हैं func.<propertyname> के रूप में उसके गुण।

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