2012-07-06 6 views
6

मुझे यकीन है कि वास्तव में कैसे मेरे सवाल वाक्यांश के लिए, तो मुझे एक उदाहरण पेश करते हैं नहीं कर रहा हूँ:प्रारंभिक फ़ंक्शन में ईवेंट श्रोता में प्रोटोटाइप फ़ंक्शन कैसे जोड़ सकता हूं?

function foo() { 
    window.addEventListener("keydown", function(event) { 
     bar(event.keycode); 
} 

foo.prototype.bar = function (keycode) { 
//code 
} 

मैं this.bar() उपयोग करने की कोशिश की है, लेकिन है कि windowthis के रूप में प्रयोग का परिणाम है। क्या ऐसा करने का कोई तरीका है, या मुझे मैन्युअल रूप से एक और प्रारंभिक विधि कॉल करना होगा?

उत्तर

7

बाइंड this.bar से this इससे पहले कि आप इसे पारित करें।

function foo() { 
    window.addEventListener("keydown", this.bar.bind(this), false); 
} 


foo.prototype.bar = function (event) { 
    console.log(event.keyCode); 
} 

डेमो http://jsfiddle.net/2tee4/

+0

क्यों बाँध? 'window.addEventListener (" keydown ", this.bar, false);'? –

+1

@ शेखहेरा, ताकि 'बार 'के संदर्भ में' बार 'को बुलाया जा सके, अन्यथा इसे वैश्विक दायरे में निष्पादित किया जाएगा और प्रोटोटाइप फ़ंक्शन को बाध्य करने का कोई फायदा नहीं होगा। – zzzzBov

+0

@ शेखहेरा '.बिंद' इस मान को हमेशा वही मानता है चाहे बाध्य कार्य कैसे कहा जाता है। इस मामले में, यह हमेशा 'foo' ऑब्जेक्ट होगा। – Esailija

5

एक वैकल्पिक समाधान अगर आप Function.prototype.bind उपलब्ध * की जरूरत नहीं है, और आप Function.prototype करने के लिए अतिरिक्त कार्यों को जोड़ने में होगा this.bar को कॉल पर बंद करने के लिए तैयार नहीं कर रहे हैं:

function foo() { 
    var self; 
    self = this; 
    window.addEventListener('keydown', function (e) { 
     self.bar(e); 
    }, false); 
} 
foo.prototype.bar = function (e) { 
    console.log(e.keyCode); 
} 

* हालांकि attachEvent बिना addEventListener के आपके उपयोग मुझे विश्वास है कि Function.prototype.bind एक acce होगा ptable पसंद


इसके अतिरिक्त, jQuery के रूप में पुस्तकालयों bind के अपने स्वयं के रूप में शामिल हो सकते, jQuery के jQuery.proxy है।

+0

अतिरिक्त विकल्पों के लिए धन्यवाद, अधिक जानकारी प्राप्त करना हमेशा अच्छा होता है। और भी अधिक तो जब यह किसी और के लिए Google पर एक खोज परिणाम बन जाता है ... – Bloodyaugust

4

आपका इरादा हर foo बनाई गई के लिए एक नया श्रोता जोड़ने के लिए है, तो एक और विकल्प fooEventListener इंटरफ़ेस को लागू करने के लिए, और बस संचालक के स्थान पर this पार जाते हैं।

function Foo() { 
    window.addEventListener("keydown", this, false); 
} 

Foo.prototype.bar = "foobar"; 

Foo.prototype.handleEvent = function(e) { 
    console.log(e.type); // "mousedown" (for example) 
    console.log(this.bar); // "foobar" 
}; 

new Foo(); 

ध्यान दें कि यह केवल addEventListener() के साथ काम करता है।

डेमो:http://jsfiddle.net/k93Pr/

+2

+1, यह बहुत ही अच्छा होगा अगर jQuery ने भी इसका समर्थन किया है, तो मेरे लिए बहुत से '$ .proxy' बॉयलरप्लेट से छुटकारा पड़ेगा :) – Esailija

+0

चूंकि उपर्युक्त टिप्पणी उभरी है, इसलिए मैं अपने टिकट को लिंक कर रहा हूं: http://bugs.jquery.com/ticket/12031: पी – Esailija

+1

@Esailija: यह देखना दिलचस्प होगा कि वे इसे कार्यान्वित करते हैं या नहीं। हालांकि मैं jQuery के लिए इंतजार नहीं करता। बस इसे एक प्लगइन बनाओ। यहां एक सरल और शायद बेवकूफ प्रारंभिक कार्यान्वयन है। बस '.on() 'के अन्य हस्ताक्षरों के लिए समर्थन जोड़ने की आवश्यकता है। http://jsfiddle.net/suQEZ/ * (मुझे पता है कि आपको मुझे दिखाने के लिए मुझे ज़रूरत नहीं थी। यह दूसरों के लिए अधिक है।) * –

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