2012-03-31 16 views
29

में संपत्ति जोड़ें डिफ़ॉल्ट रूप से Arrays की "लंबाई" संपत्ति होती है।जावास्क्रिप्ट सरणी

क्या मैं उनके लिए कस्टम गुण जोड़ सकता हूं?

उन्हें ऑब्जेक्ट्स बनाने के बिना

+2

* क्या आपको "वस्तुओं को बनाने के बिना कस्टम गुण जोड़ें" का अर्थ क्या है? * Arrays ऑब्जेक्ट्स हैं। जेएस में बस सबकुछ एक वस्तु है। और ये गुण क्या हैं? क्या आप आगे समझा सकते हैं? – Joseph

+0

वे ** ** ऑब्जेक्ट्स हैं। बस एक विशेष प्रकार की वस्तुओं।उदाहरण के लिए कार्यों की तरह जो एक विशेष प्रकार की वस्तुएं भी हैं। – ThiefMaster

+0

यह भी देखें [यह संबंधित प्रश्न] (http://stackoverflow.com/questions/24730145/what-are-the-drawbacks-of-setting-string-properties-on-arrays) क्योंकि आपको ऐसा क्यों नहीं करना चाहिए। –

उत्तर

37

निश्चित रूप से।

var arr = [1,2,3,4,5]; 
arr.prop = 'value'; 

सरणी पहले से ही जावास्क्रिप्ट में वस्तुओं रहे हैं - वे बस कुछ अतिरिक्त सुविधाओं और एक विशेष शाब्दिक वाक्य रचना की है।

+0

मेरी संपत्ति शेष तत्वों के साथ पुनरावृत्त हो जाएगी? क्योंकि console.log में मुझे इसे "लंबाई" – ellabeauty

+5

जैसे अपारदर्शी पाठ के साथ नहीं दिखाई देता है जब आप '(var arr में var key' का उपयोग करते हैं, तो उन्हें फिर से सक्रिय किया जाएगा। लेकिन ऐसा कुछ है जिसे आपको किसी भी तरह से सरणी पर उपयोग नहीं करना चाहिए, इसलिए यह आपके लिए कोई समस्या नहीं होनी चाहिए। ए '(var i = 0; i ThiefMaster

+0

यदि आप 'इन इन लूप' का उपयोग करते हैं, तो संपत्ति पुनरावृत्त किया जाएगा। नियमित रूप से 'लूप' में, यह नहीं होगा - क्योंकि आप केवल प्रत्येक सदस्य को अपनी सरणी अनुक्रमणिका द्वारा एक्सेस कर रहे होंगे। यह देशी सरणी ES5 विधियों जैसे 'forEach' द्वारा भी पुनरावृत्त नहीं किया जाएगा। –

2

हां। तुम बस उन्हें घोषणा करके वस्तु में जोड़ सकते हैं और आप भी Array.prototype

var j = new Array(); 
j.yourprop = "foo"; 
+4

' var j = [];' अच्छा है। – ThiefMaster

+3

हाँ मैं सहमत हूं कि मेरा तरीका –

+11

बेकार है, मैं 'var j = (फ़ंक्शन (सरणी) {वापसी नया सरणी();} (window.Array))' –

22

का उपयोग कर अन्य उत्तर राज्य के रूप में सरणी का विस्तार कर सकते हैं, यह पूरी तरह से संभव है, क्योंकि जावास्क्रिप्ट में सरणियों सिर्फ वस्तुओं रहे हैं। हालांकि, अभी भी एक सवाल है कि यह एक अच्छा विचार है या नहीं।

यह एक "कोडिंग शैली" प्रश्न है, इसलिए निष्पक्ष रूप से कहना मुश्किल है, लेकिन डगलस क्रॉकफोर्ड को इसके साथ कोई समस्या नहीं है (कम से कम कुछ मामलों में)। JavaScript: The Good Parts में, वह वास्तव में एक सरणी में "कुल" विधि जोड़ने का उदाहरण उपयोग करता है। परिवर्तन

// Give the data array a total function 

data.total = function() { 
    return this.reduce(add, 0); 
}; 

total = data.total(); // total is 108 

के बाद से स्ट्रिंग 'total' एक पूर्णांक नहीं है, एक सरणी के लिए एक total प्रॉपर्टी जोड़ नहीं है:

क्योंकि एक सरणी वास्तव में एक वस्तु है, हम तरीकों सीधे एक व्यक्ति के सरणी को जोड़ सकते हैं इसकी लंबाई

(p62, Crockford की 'जावास्क्रिप्ट अच्छा पार्ट्स ", Google Books को मिला था)

हालांकि, यह उल्लेख है कि ये अतिरिक्त गुण JSON क्रमबद्धता में शामिल नहीं हैं, और फेंक दिया होगा अगर आप ऐसा करेंगे लायक है arr = arr.slice(1); जैसी कुछ भी।

+0

पर कुछ और जीवनकाल देने के लिए संदर्भों को शामिल करने के लिए धन्यवाद' नया सरणी();} (window.Array) 'लौटाएं। –

+0

इसके अलावा, अगर सरणी किसी भी प्रोटोटाइप विधियों (मानचित्र, फ़िल्टर इत्यादि) के माध्यम से जाती है तो संपत्ति को नए सरणी में स्थानांतरित नहीं किया जाएगा, क्योंकि विधि 'ऐरे' के उदाहरण पर रखी गई थी। शायद उम्मीद है लेकिन शायद इस मामले में वांछनीय नहीं है? –

1

यदि आप इसे ऐरे आदि में छिपाना चाहते थे? [कम से कम है कि मैं के लिए क्या देख रहा था।]

Object.defineProperty(targ, "myVal", { enumerable: false, writable: true }); 

तब सरणी तो यह एक संपत्ति एक मूल्य मैं आप कह सकते हैं लगता है कि नहीं है लंबाई में जोड़ने नहीं करता है।

फिर यदि आप किसी ऑब्जेक्ट में कुंजी को देखना चाहते हैं, तो Object.keys इसे नहीं देख पाएंगे, लेकिन Reflect.ownKeys करेंगे।

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/ownKeys

defineProperty के संस्करण प्रतिबिंबित सफलता वापसी या असफल हो जायेगी, जबकि वस्तु के रिटर्न वस्तु पारित कर दिया।

रोकें याद रखें एक्सटेंशन (जैसे यह कहता है) आपको या दूसरों को विस्तारित करने से रोकता है। https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/preventExtensions

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