2015-09-13 15 views
7

में नामांकित कुंजियों का उपयोग करके मैं The Principles of Object-Oriented Javascript के माध्यम से काम कर रहा हूं और एक सरणी के अंदर नामित कुंजी के जकास के उपयोग के साथ उलझन में हूं (जैसा किसी ऑब्जेक्ट के अंदर है)। टिप्पणी देखें:जेएस सरणी

function EventTarget() {} 

EventTarget.prototype = { 

    constructor: EventTarget, 

    addListener: function(type, listener) { 

     if (!this.hasOwnProperty("_listeners")) { 
      // Why isn't this: `this._listeners = {};` 
      this._listeners = []; 
     } 

     if (typeof this._listeners[type] === "undefined") { 
      this._listeners[type] = []; 
     } 

     this._listeners[type].push(listener); 
    }, 

    // more stuff 
} 

var target = new EventTarget(); 
target.addListener("message", function(event) { 
    console.log("Message is " + event.data); 
}); 

उनकी कोड ठीक काम करता है (के रूप में यह है, तो आप एक वस्तु शाब्दिक के लिए सरणी स्थानापन्न करता है), लेकिन मेरी समझ रहा है कि आप एक वस्तु का उपयोग करना चाहिए आप नाम से सामग्री का उपयोग करना चाहते हैं। array article on w3schools से:

कई प्रोग्रामिंग भाषा नामित इंडेक्स के साथ सरणी का समर्थन करती हैं।
नामित इंडेक्स वाले Arrays को सहयोगी सरणी (या हैश) कहा जाता है।
जावास्क्रिप्ट नामित इंडेक्स के साथ समर्थन सरणी नहीं करता है।
जावास्क्रिप्ट में, सरणी हमेशा क्रमांकित अनुक्रमणिका का उपयोग करें।

क्या कोई अच्छा कारण है कि जकास ने इस तरह एक सरणी का उपयोग किया? क्या आप इसे समझा सकते हैं? वैकल्पिक रूप से, क्या यह मुझे the errata पर सबमिट करना चाहिए?

+0

इस कोड को 'अगर type' सही है पूर्णांक – hindmost

+0

है यह कोड अभी भी काम करता है क्योंकि यह सरणी ऑब्जेक्ट पर गुण सेट कर रहा है, वास्तविक सरणी में नहीं। 'ऑब्जेक्ट.getOwnPropertyNames (this._listeners)' और फिर 'ऑब्जेक्ट.कीज़ (this._listeners)' देखें। 'this._listeners' एक ऑब्जेक्ट होना चाहिए, एक सरणी नहीं। – usandfriends

+0

@ हिंडोस्ट: कोड सही है (इसमें यह कार्यात्मक है) भले ही 'टाइप' * एक पूर्णांक नहीं है (और ऐसा लगता है कि यह संभव नहीं होगा, एक स्ट्रिंग होने की संभावना अधिक है" ')। –

उत्तर

5

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

संपादित करें: लगभग कुछ एक ऑब्जेक्ट (यह मेरे लिए हुआ है कि किसी जावास्क्रिप्ट में सबसे आम त्रुटियों में से एक के बाद से undefined पर एक गुण सेट करने के लिए, की कोशिश कर सकते है TypeError : undefined is not an object है आह जावास्क्रिप्ट, क्यों कर रहे हैं। आप हमें ऐसा करने?

+1

का उपयोग किया जाता है" सबकुछ एक वस्तु है "। सब कुछ नहीं! – undefined

+1

अपरिभाषित एक वस्तु नहीं है ... 'टाइप अप अपरिभाषित === "अपरिभाषित" ' – usandfriends

2

इसका कोई खास कारण है कि Zakas इस तरह एक सरणी इस्तेमाल किया है?

उद्धृत कोड से, मैं एक नहीं सोच सकते हैं, नहीं। वह प्रयोग नहीं कर रहा है च कार्य करें कि _listeners एक सरणी को संदर्भित करता है। यह स्पष्ट रूप से सिर्फ एक टाइपो की तरह दिखता है। चूंकि यह काम करता है (क्योंकि जावास्क्रिप्ट के सामान्य सरणी वस्तुएं हैं), टाइपो पकड़ा नहीं गया था। ठीक है, जब तक आप इसे पकड़ा नहीं। :-)

जब तक कोई कोड नहीं है तो आपने उस उद्धरण में सरणी एनरी * जोड़कर उद्धृत नहीं किया है, वहां सरणी का उपयोग करने का कोई कारण नहीं है (और तर्कसंगत रूप से कुछ कारण नहीं हैं)।

* "सरणी प्रविष्टि" = संपत्ति जिसका कुंजी सरणी अनुक्रमणिका है। तो एक "सरणी सूचकांक" क्या है? "ए स्ट्रिंग प्रॉपर्टी नाम पी एक सरणी अनुक्रमणिका है यदि केवल ToString(ToUint32(P)) पी और ToUint32(P) के बराबर है 232−1 के बराबर नहीं है।" (spec)

2

Arrays केवल विशेष वस्तुएं हैं ....

a=[] 
a[7]=9 
a["abc"]=20 
a["xxx"]=30 
for (i in a) console.log("value",i,a[i]) 

आउटपुट;

value 7 9 
value abc 20 
value xxx 30 
0

मैं इसे लिखने में कोई त्रुटि है, लेकिन बंद का मौका में यह इरादा था कहने के लिए इच्छुक हूँ, उसके बाद निम्न केवल कार्यात्मक यूज-केस मैं के साथ आ सकता है ... (चेतावनी: हो सकता है राय विभाजित करें)।

यह देखते हुए कि एक पर्यवेक्षक/घटना पैटर्न एक सामान्य अवधारणा है कि किसी भी वस्तु और "निजी" (अंडरस्कोर से चिह्नित) को लागू किया जा सकता है _listeners संपत्ति लक्ष्य से के बारे में जाना जाने की जरूरत होने की संभावना कभी नहीं होगा है - तो यह तर्कसंगत है कि इसमें मौजूद डेटा वस्तु के लिए अनिवार्य है।

ऐसा कहने के लिए, संभवतः इस प्रकार के डेटा को प्रेषित करने के लिए वांछनीय नहीं है लक्ष्य लक्ष्य को क्रमबद्ध किया जाना चाहिए। निम्नलिखित उदाहरण बताता है कि JSON serializer पर ध्यान नहीं देता foo.baz में गैर-संख्यात्मक सरणी गुण - इसी तरह अपने स्वयं के उदाहरण में, सभी संलग्न घटना डेटा हटा दिया जाएगा:

var foo = { 
    bar: {}, 
    baz: [] 
}; 

foo.bar['p1'] = foo.baz['p1'] = 1; 
foo.bar['p2'] = foo.baz['p2'] = 2; 

console.log(JSON.stringify(foo)); // {"bar":{"p1":1,"p2":2},"baz":[]}