2009-09-02 17 views
11

का उपयोग करते समय ईवेंट विधियों में "यह" कीवर्ड मैं एक ईवेंट हैंडलर में जावास्क्रिप्ट में प्रोटोटाइप क्लास के सदस्य चरों तक पहुंचने का प्रयास कर रहा हूं - कुछ ऐसा जो मैं आमतौर पर "इस" कीवर्ड का उपयोग करता हूं (या इवेंट हैंडलर के मामले में "वह" [इसकी प्रतिलिपि])। कहने की जरूरत नहीं है, मैं कुछ परेशानी में भाग रहा हूँ।जावास्क्रिप्ट प्रोटोटाइप ऑब्जेक्ट

उदाहरण के लिए, इस HTML स्निपेट:

<a id="myLink" href="#">My Link</a> 

और यह जावा स्क्रिप्ट कोड:

function MyClass() 
{ 
    this.field = "value" 
    this.link = document.getElementById("myLink"); 
    this.link.onclick = this.EventMethod; 
} 

MyClass.prototype.NormalMethod = function() 
{ 
    alert(this.field); 
} 

MyClass.prototype.EventMethod = function(e) 
{ 
    alert(this.field); 
} 

एक MyClass वस्तु instantiating और NormalMethod बुला वास्तव में काम करता है जैसे मैं इसे करने के लिए (चेतावनी कहा, "उम्मीद मान "), लेकिन लिंक परिणामों को एक अपरिभाषित मान में क्लिक करना क्योंकि" यह "कीवर्ड अब ईवेंट लक्ष्य (एंकर() HTML तत्व का संदर्भ देता है)।

मैं प्रोटोटाइप जावास्क्रिप्ट शैली के लिए नए हूँ, लेकिन अतीत में, बंद के साथ, मैं बस "इस" निर्माता में की एक प्रतिलिपि बना दिया है:

var that = this; 

और फिर मैं सदस्यों को एक्सेस कर सका "उस" ऑब्जेक्ट के माध्यम से ईवेंट विधियों में चर। ऐसा प्रोटोटाइप कोड के साथ काम नहीं प्रतीत होता है। क्या यह हासिल करने का कोई और तरीका है?

धन्यवाद।

+0

आप प्रोटोटाइप पुस्तकालय के लिए या बल्कि सीधे जावास्क्रिप्ट प्रोटोटाइप कक्षाएं जिक्र कर रहे हैं: यह सवाल एक और तो सवाल जो पूरे प्रोटोटाइप पुस्तकालय को शामिल किए बिना बाँध विधि के कार्यान्वयन के साथ यहाँ उत्तर दिया जाता है का डुप्लिकेट है? –

+3

तीन साल देर से जवाब दे रहा है :) लेकिन वंशावली के लिए: मैं सीधे जावास्क्रिप्ट प्रोटोटाइपिकल कक्षाओं का जिक्र कर रहा था। – Michael

+0

संभावित डुप्लिकेट [कॉलबैक के अंदर सही 'इस'/संदर्भ को कैसे एक्सेस करें?] (Http://stackoverflow.com/q/20279484/1048572)? – Bergi

उत्तर

9

आपका "that=this" बंद मुहावरा अभी भी लागू होता है:

function MyClass() 
{ 
    ... 

    var that = this; 
    this.link.onclick = function() { 
     return that.EventMethod.apply(that, arguments); 

     // that.EventMethod() works too here, however 
     // the above ensures that the function closure 
     // operates exactly as EventMethod itself does. 

    }; 
} 
5

आप की कोशिश करनी चाहिए

this.link.onclick = this.EventMethod.bind(this); 
13

आप की जरूरत है:

this.link.onclick = this.EventMethod.bind(this); 

... 'बाँध' प्रोटोटाइप का हिस्सा है, और एक फ़ंक्शन देता है जो आपकी विधि को 'इस' सेट के साथ सही तरीके से कॉल करता है।

+0

'ऑनक्लिक' ईवेंट इंटरफ़ेस तक पहुंच कैसे प्राप्त करता है? – Karl

+0

@ karl "ईवेंट इंटरफ़ेस तक पहुंच" से आपका क्या मतलब है "ईवेंट ऑब्जेक्ट को तर्क के रूप में प्राप्त करें"? 'बाइंड' विधि ** एक फ़ंक्शन ** (एक निश्चित 'यह' के साथ) देता है, इसलिए' onclick = this.EventMethod' मूल रूप से 'onclick = this.EventMethod.bind (this)' जैसा ही है।दोनों स्थितियों में, आप 'ऑनक्लिक' संपत्ति में एक फ़ंक्शन संग्रहीत करते हैं; वे समान हैं कि उनके तर्कों को कैसे संभाला जाता है। यदि आपका प्रश्न आम तौर पर श्रोता कार्यों के लिए तर्क कैसे पारित किया जाता है, तो यह पूछताछ की तुलना में यह एक अलग सवाल है, और आपको एक नया प्रश्न पूछना चाहिए। – apsillers

0

ऊपर बताए अनुसार, प्रोटोटाइप लाइब्रेरी का एक हिस्सा है जो बाइंड का उपयोग करना इस समस्या को हल करने का एक साफ तरीका है।

https://stackoverflow.com/a/2025839/1180286

+0

वह प्रश्न JQuery का उपयोग करता है। मैं एक शुद्ध जावास्क्रिप्ट प्रश्न/उत्तर मानक होना चाहता हूं। –

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