2015-06-17 6 views
23

इस कक्षा को देखते हुए; मैं उन तरीकों से कैसे पुन: प्रयास करूंगा जिनमें यह शामिल है?ES6 कक्षा वर्ग विधियों पर Iterate

for (var each in Object.getPrototypeOf(cat)){ 
    console.log(each); 
} 
+1

'पशु से अधिक पुनरावृत्ति नहीं करना चाहिए .prototype' काम? जो मैं समझता हूं, अंतर्निहित वस्तु वास्तुकला अभी भी "पुराने" तरीके के समान है। – slebetman

+0

Animal.prototype विधियों का खुलासा करता है। मुझे लगता है कि समस्या उन पर पुनरावृत्ति के रास्ते में है। के लिए .. में काम नहीं लग रहा है। – seasick

उत्तर

39

आप प्रोटोटाइप पर Object.getOwnPropertyNames उपयोग कर सकते हैं:

class Animal { 
    constructor(type){ 
     this.animalType = type; 
    } 
    getAnimalType(){ 
     console.log('this.animalType: ', this.animalType); 
    } 
} 

let cat = window.cat = new Animal('cat') 

मैं क्या कोशिश की है कोई सफलता के साथ पीछा कर रहा है

Object.getOwnPropertyNames(Animal.prototype) 
// [ 'constructor', 'getAnimalType' ] 
+0

मैंने यह कोशिश नहीं की है - लेकिन क्या यह विरासत में प्राप्त कुछ पर काम करेगा? मुझे यकीन नहीं है कि यह होगा ... और केवल सुपर क्लास के लिए। – seasick

+2

@seasick यह काम करता है, लेकिन आपको 'ऑब्जेक्ट' का उपयोग करने की आवश्यकता होगी।getPrototypeOf' भी, प्रोटोटाइप को पहले प्राप्त करने के लिए: 'Object.getOwnPropertyNames (Object.getPrototypeOf (बिल्ली)) ' – Paulpro

+0

धन्यवाद !!!! यह निश्चित रूप से काम करता है, लेकिन इसके वाक्यविन्यास पर विचार करते हुए .. मुझे आश्चर्य है कि यह ऐसा कुछ करने का पसंदीदा तरीका है। मैं जो कर रहा हूं वह सिर्फ कक्षा के सभी तरीकों को कॉल करना है, लेकिन इसे शाब्दिक प्रकार के फैशन में नहीं करना चाहते हैं, इसलिए मैं उनके माध्यम से पुन: प्रयास करना चाहता था। – seasick

0

जांच इस बेला

https://jsfiddle.net/ponmudi/tqmya6ok/1/

class Animal { 
    constructor(type){ 
     this.animalType = type; 
    } 
    getAnimalType(){ 
     console.log('this.animalType: ', this.animalType); 
    } 
} 

let cat = new Animal('cat'); 

//by instance 
document.getElementById('1').innerHTML = Object.getOwnPropertyNames(cat); 

//by getting prototype from instance 
document.getElementById('2').innerHTML = Object.getOwnPropertyNames(Object.getPrototypeOf(cat)); 

//by prototype 
document.getElementById('3').innerHTML = Object.getOwnPropertyNames(Animal.prototype); 
0

यदि आपको सुपरक्लास विधियों को भी प्राप्त करने की आवश्यकता है, तो आप उन्हें Object.getPrototypeOf() बार-बार कॉल कर सकते हैं जब तक कि आप उन्हें सब कुछ नहीं पाते। जब आप Object.prototype पर जाते हैं तो आप शायद रुकना चाहेंगे, क्योंकि वहां की विधियां मौलिक हैं और आप आमतौर पर प्रतिबिंब का उपयोग करने वाले किसी भी कोड से उन्हें छूना नहीं चाहते हैं।

प्रश्न Get functions (methods) of a class में एक उत्तर है जिसमें ऐसा करने के लिए एक फ़ंक्शन शामिल है, लेकिन इसमें कुछ कमियां थीं (जिसमें लूप स्थिति का उपयोग करना शामिल था, जिसमें फ़ंक्शन तर्क को संशोधित करने का दुष्प्रभाव था, जिसे मैं दो संदिग्ध कोड शैली विकल्प बनाता हूं कोड ...) की एक पंक्ति में है, इसलिए मैं इसे यहाँ फिर से लिख दिया:

export function listMethodNames (object, downToClass = Object) 
{ 
    // based on code by Muhammad Umer, https://stackoverflow.com/a/31055217/441899 
    let props = []; 

    for (let obj = object; obj !== null && obj !== downToClass.prototype; obj = Object.getPrototypeOf(obj)) 
    { 
     props = props.concat(Object.getOwnPropertyNames(obj)); 
    } 

    return props.sort().filter((e, i, arr) => e != arr[i+1] && typeof object[e] == 'function'); 
} 

साथ ही मूल कोड में बग फिक्सिंग (जो पाश के लिए एक और चर में वस्तु की नकल नहीं की थी , इसलिए जब तक रिटर्न लाइन में फ़िल्टरिंग के लिए इसका इस्तेमाल किया गया था, यह अब मान्य नहीं था) यह कॉन्फ़िगर करने योग्य वर्ग पर पुनरावृत्ति को रोकने के लिए वैकल्पिक तर्क देता है। यह Object पर डिफ़ॉल्ट होगा (इसलिए Object के तरीकों को बाहर रखा गया है; यदि आप उन्हें शामिल करना चाहते हैं तो आप एक वर्ग का उपयोग कर सकते हैं जो विरासत श्रृंखला में दिखाई नहीं दे रहा है ... शायद मार्कर क्लास जैसे class IncludeObjectMethods{} समझ में आ सकता है)। मैंने do लूप को एक स्पष्ट for लूप में भी बदल दिया है और कोड को अधिक कॉम्पैक्ट बनाने के लिए पुरानी शैली function ... फ़िल्टर फ़ंक्शन को ES6 तीर फ़ंक्शन में फिर से लिखा है।

2

ईएस 6 कक्षा पर विधियां गैर-गणना योग्य हैं, इसलिए आपके पास अन्य सभी गुणों की एक सरणी प्राप्त करने के लिए Object.getOwnPropertyNames() का उपयोग करने के अलावा कोई अन्य विकल्प नहीं है।

इसे प्राप्त करने के बाद, विधियों को निकालने के कई तरीके हैं, जिनमें से सबसे सरल Array.prototype.forEach() का उपयोग कर सकता है। निम्नलिखित स्निपेट

चेक आउट:

Object.getOwnPropertyNames(Animal.prototype).forEach((value) => { 
    console.log(value); 
}) 
3

मुझे पता है, मुझे पता है, लेकिन हे ...

const deepProps = x => x && x !== Object.prototype && Object.getOwnPropertyNames(x).concat(deepProps(Object.getPrototypeOf(x)) || []); 
const deepFunctions = x => deepProps(x).filter(name => typeof x[ name ] === "function"); 
const userFunctions = x => new Set(deepFunctions(x).filter(name => name !== "constructor" && !~name.indexOf("__"))); 

उपयोग:

class YourObject { 
    hello() { return "uk"; } 
    goodbye() { return "eu"; } 
} 

class MyObject extends YourObject { 
    hello() { return "ie"; } 
} 

const x = new MyObject(); 
userFunctions(x); // [ "hello", "goodbye" ] 
+0

चयनित उत्तर होना चाहिए, यह ईएस 6 और गतिशील वस्तु और ईएस 6 विरासत दोनों के लिए काम करता है। – ktutnik

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