2014-07-22 8 views
6

मैं सिर्फ अगर वहाँ एक for in पाश में एक वस्तु संपत्ति की तरह गणनीय बनाने के लिए, लेकिन जैसे कीक्या आप गुणों को समृद्ध बना सकते हैं लेकिन जावास्क्रिप्ट में पुन: प्रयोज्य नहीं हैं?

Object.defineProperty({},'prop',{ 
    enumerable:true, 
    iterable:false 
} 

नहीं तो एक for of loop तरह में दिखाई नहीं एक तरीका है सोच रहा था, वहाँ एक सुविधा को लागू करने के लिए कोई योजना नहीं है इस तरह? या for of पाश संख्यात्मक गुण

+0

मैं इसे googled है ... मैं कुछ भी सुझाव नहीं मिला है कि उस सटीक नाम के साथ एक विशेषता होगी। मैं बस सोच रहा हूं कि क्या वे मूल्यों को पुन: प्रयोज्य बनाने के लिए एक तरीका लागू करने की योजना हैं और कुंजियां अलग नहीं हैं, मैं थोड़ा और स्पष्ट –

+1

बनाने के लिए अपना प्रश्न अपडेट करूंगा, तो आप शायद गलत जगह पर पूछ रहे हैं। ईएस 6 मेलिंग सूचियों पर पूछने से आपको जवाब देने की संभावना अधिक है। कोड जवाब के साथ कोड प्रश्न पूछने के बारे में Stackoverflow सबसे प्रमुख है। –

+4

@ माइक'पोमैक्स 'कमरमैन को इसके बारे में कठोर होने की आवश्यकता नहीं है। एक तरफ दृष्टिकोण, इस सवाल के बारे में कुछ भी विषय नहीं है। सी ++ 11 का गठन होने पर हमने कई समान प्रश्न देखा। –

उत्तर

4

मैंने मोज़िला विकास नेटवर्क (एमडीएन) में कुछ खोदने का उपयोग किया है।

यह पता लगाने के लिए कि ऑब्जेक्ट्स obj.propertyIsEnumerable(prop) विधि है, यह जांचने के लिए कि संपत्ति समृद्ध है या नहीं। एमडीएन में दिए गए उदाहरणों से, प्रोटोटाइप श्रृंखला के माध्यम से विरासत में प्राप्त गुण संख्यात्मक नहीं हैं, इस प्रकार विधि उन गुणों के लिए झूठी रिटर्न देती है।

गैर-संख्यात्मक गुणों का एक उदाहरण कन्स्ट्रक्टर और संपत्ति length सरणी के गुण हैं।

प्रश्न के पुनरावर्तनीय हिस्से के लिए, मैं एमडीएन उद्धृत करूंगा: "ईसीएमएस्क्रिप्ट 6 में इटेबल एक इंटरफ़ेस (या दूसरे शब्दों में, एक प्रोटोकॉल) है, न कि ऑरे या मैप जैसे ऑब्जेक्ट का प्रकार।

यह कहना है कि ऑब्जेक्ट को इसके गुणों को लागू करने के लिए इस इंटरफ़ेस को कार्यान्वित करने की आवश्यकता है। स्ट्रिंग, ऐरे, मैप, सेट, वीकसेट और जेनरेटर ऑब्जेक्ट्स जैसे पुनरावृत्तियों में निर्मित यह मामला है।

निम्नलिखित कोड सचित्र इस:

var aString = "hello" 
typeof aString[Symbol.iterator] // "function" 
aString[Symbol.iterator]() + "" // "[object String Iterator]" 
[...aString]     // ["h", "e", "l", "l", "o"] 
बेशक

, आप अपने खुद इटरेटर कार्यान्वयन परिभाषित कर सकते हैं।

प्रश्न पर वापस आना, ऑब्जेक्ट या उसके प्रोटोटाइप से जुड़े गुण (सीधे, अर्थात् विरासत के माध्यम से नहीं) को for...in लूप में गणना के रूप में प्रदर्शित किया जाएगा। पुनरावृत्तियों के लिए आपको एक कार्यान्वयन की आवश्यकता है, या तो पहले उल्लिखित, या स्वयं का। एमडीएन से यहां एक महान उदाहरण है।

let arr = [ 3, 5, 7 ]; 
arr.foo = "hello"; 

for (let i in arr) { 
    console.log(i); // logs "0", "1", "2", "foo" these are property names or indexes 
} 

for (let i of arr) { 
    console.log(i); // logs "3", "5", "7" these are actual values of an 
        // iterable implementation provided by the array prototype 
} 

let कीवर्ड एक var परिभाषा को इस संदर्भ में बराबर है (हालांकि यह अधिक प्रभाव पड़ता है, लेकिन वे इस पद के दायरे से बाहर हैं)।

आप देख सकते हैं सरणी iterable इंटरफेस (सरणी प्रोटोटाइप से) की पहले से ही एक कार्यान्वयन है, इस प्रकार यह अपने मूल्यों को जब for...of पाश का उपयोग कर, जबकि foo संपत्ति प्रदर्शित नहीं किया जाता पैदावार (न तो मूल्य है और न ही संपत्ति का नाम) ।

इसलिए यदि आपका ऑब्जेक्ट iterable इंटरफ़ेस को कार्यान्वित नहीं करता है, तो यह पुनरावृत्त नहीं होना चाहिए (सिद्धांत रूप में) और इस प्रकार यह for...of लूप में इसकी गुणों को प्रदर्शित करेगा।

2

for in and for of evaluations के बीच का अंतर यह है कि obj.[[enumerate]] का उपयोग करता है और दूसरा लूप आइटम निर्धारित करने के लिए GetIterator(obj) का उपयोग करता है। [[enumerate]] does

वापसी obj की गणनीय सभी गुणों की स्ट्रिंग मान चाबियाँ पर एक Iterator object जिसका next विधि दोहराता (जब तक obj एक प्रॉक्सी है)।

GetIterator (करने की कोशिश) होगा फोन @@iterate method - हालांकि, सामान्य वस्तुओं इस इंटरफ़ेस को लागू नहीं है।

तो कोई संपत्ति for of छोरों में दिखाई देगा जब तक आप स्पष्ट यह राज्य:

function defineIterableProperty(obj, prop, desc) { 
    let old = obj[Symbol.iterate]; 
    Object.defineProperty(obj, prop, desc); 
    obj[Symbol.iterate] = function*() { 
     if (old) yield* old.call(this); 
     yield prop; 
    }; 
    return obj; 
} 

(untested है, लेकिन मुझे आशा है कि आप विचार प्राप्त)

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

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