ईएस 6 - एक वर्ग के भीतर स्थिर विधि को कॉल करें


82

मेरे पास यह वर्ग है जो स्थैतिक विधि से आंतरिक कॉल करता है:

export class GeneralHelper extends BaseHelper{
     static is(env){
          return config.get('env:name') === env;
     }

     static isProd(){
         return GeneralHelper.is('prod');
     }
 }

क्या मेरे पास नीचे पंक्ति में कक्षा का नाम बदलने के लिए उपयोग किए जाने वाले कोई भी कीवर्ड हैं:

GeneralHelper.is('prod');

PHP में हैं self,static आदि क्या ES6 इन के समान कुछ भी प्रदान करता है?

टीआई।


मैंने इस मुद्दे के बारे में एक अलग सूत्र में अधिक जटिल उत्तर पोस्ट किया है: stackoverflow.com/a/43694337/3182819
थॉमस शहरी

जवाबों:


74

यदि आप एक उदाहरण के अंदर से स्टेटिक फ़ंक्शन को कॉल कर रहे हैं, तो क्लास स्टैटिक फ़ंक्शन को संदर्भित करने का सही तरीका है:

this.constructor.functionName();

es6 कॉल स्थिर तरीके


11
ओपी एक उदाहरण से इसे कॉल करने के बारे में नहीं पूछ रहा है। (यदि वह था, तो यह आपके द्वारा जुड़े प्रश्न का एक डुप्लिकेट होगा)
बरगी

वह भी कोई जवाब नहीं है। this.constructor.is('prod')इस मामले में त्रुटि फेंक देंगे।
उत्कर्षप्रमोदगुप्त

यह वह उपाय है जब आप अपनी स्टेटिक विधि को कॉल करना चाहते हैं जब आप एक त्वरित श्रेणी के अंदर होते हैं, अन्यथा आप बस कॉल करते हैं this.method()। इसके अलावा जब आप कोई क्लास बढ़ाते हैं तो आप कहते हैंsuper.method()

54

यह एक साधारण वस्तु पर एक विधि को कॉल करने के समान है । यदि आप GeneralHelper.isProd()विधि कहते हैं , तो विधि के GeneralHelperरूप thisमें उपलब्ध होगी , इसलिए आप उपयोग कर सकते हैं

class GeneralHelper {
     static is(env) { … }
     static isProd(){
         return this.is('prod');
     }
}

यह तब काम नहीं करेगा जब विधि कॉलबैक फ़ंक्शन के रूप में चारों ओर से गुजरती है, हमेशा की तरह । साथ ही, यह GeneralHelperस्पष्ट रूप से एक्सेस करने से अलग हो सकता है जब कोई isProdआपकी कक्षा से विरासत में मिले और ओवरराइट कर दे is, InheritedHelper.isProd()अन्य परिणाम देगा।

यदि आप उदाहरण के तरीकों से स्थिर तरीकों को कॉल करना चाहते हैं, तो यहां देखें । यह भी ध्यान दें कि एक वर्ग जो केवल स्थैतिक तरीकों को परिभाषित करता है वह एक ऑडबॉल है, आप इसके बजाय एक सादे वस्तु का उपयोग करना चाह सकते हैं।


17
मुझे लगता है कि यह स्थिर संदर्भ में "इस" कीवर्ड का काफी भ्रामक उपयोग है, लेकिन वैसे भी यह ठीक काम कर रहा है, धन्यवाद
शालोमी

6
हां, PHP $ में यह उस वस्तु के संदर्भ में है जिसे आप इस पद्धति के भीतर रखते हैं, कक्षा के तरीकों (स्थिर) में आपके पास यह कीवर्ड मौजूद नहीं है (आपके पास 'स्वयं' और नवीनतम 'स्थिर') है। जहाँ तक मुझे याद है, जावा में भी "यह" कीवर्ड स्थिर विधि में उपलब्ध नहीं है - और यह समझ में आता है: जब आप स्थिर संदर्भ में होते हैं तो कोई "यह" इकाई नहीं होती है .. "इस" के बारे में बात करनी चाहिए विशेष इकाई और स्थिर पद्धति में आप पूरी कक्षा के लिए या सामान्य क्रियाओं के लिए उल्लेख कर रहे हैं ..
श्लोमी

11
JS डेवलपर के रूप में, यह समझना बहुत महत्वपूर्ण है कि thisव्यवहार कैसे किया जाता है । यह thisअन्य भाषाओं की तरह काम नहीं करता है ।
लोगनफ़्समीथ

1
@ किडकॉन: एक कंस्ट्रक्टर इनवोकेशन एक विधि मंगलाचरण की तरह है, इसलिए यह वहां भी वैसा ही है ( thisसुपर कॉल से पहले प्रयोग करने योग्य नहीं होने के अंतर के साथ )।
बरगी

1
@ किडकॉनconstructor(){ CLASS_NAME.STATIC_METHOD(); }
मोर्टेज़ा टूरानी

33

यहाँ दोनों के उत्तर सही और अच्छे हैं, लेकिन मैं इस प्रश्न के शीर्षक के आधार पर एक और विस्तार में फेंकना चाहता था।

जब मैंने "ईएस 6 - कॉल स्टैटिक मेथड इन ए क्लास" देखा तो ऐसा लग रहा था कि "एक क्लास के भीतर एक स्टैटिक मेथड (नॉन-स्टैटिक मेथड से) कॉल"। विवरण में पूछे जाने वाले प्रारंभिक प्रश्न पूछने वाले को परिभाषित न करें।

लेकिन जो कोई जानना चाहता है कि एक गैर-स्थैतिक विधि से एक स्थिर विधि को एक कक्षा में कैसे बुलाया जाए, आप इसे इस तरह कर सकते हैं:

class MyClass {
    myNonStaticMethod () {
        console.log("I'm not static.")
        MyClass.myStaticMethod()
    }

    static myStaticMethod () {
        console.log("hey, I'm static!")
    }
}

MyClass.myStaticMethod() // will log "hey, I'm static!"

const me = new MyClass()

me.myNonStaticMethod() // will log "I'm not static" and then "hey, I'm static!"

विचार यह है कि वर्ग का नया उदाहरण बनाए बिना स्थैतिक विधि को बुलाया जा सकता है। इसका मतलब है कि आप इसे एक इंस्टेंस विधि के अंदर कॉल कर सकते हैं उसी तरह से आप इसे इंस्टेंस के बाहर कॉल करेंगे।

फिर से, मुझे पता है कि सवाल का विस्तार क्या पूछ रहा था, लेकिन यह अन्य लोगों के लिए मददगार हो सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.