2013-06-13 3 views
0

JQuery, похоже, перезаписывает ключевое слово моего метода экземпляра при добавлении в качестве обработчика события. Почему это происходит? Код ниже:JQuery, перезаписывающее это ключевое слово в прототипе

function Foo() {}; 
Foo.prototype.bark = function() { 
    console.log(this); 
}; 

var foo = new Foo(); 

$("#b").click(foo.bark); 

Выход по щелчку: <button id="b" type="button">

Однако JQuery, кажется, не переопределить this ключевое слово в коде ниже:

$("#b").click(function() { foo.bark(); }); 

Выход по щелчку:

`Foo { bark=function()}` 
+1

Я считаю, что это потому, что в контексте того, что '.bark' называется,' это 'ссылается на вашу кнопку. –

+0

Работает как и ожидалось! – Mathletics

+1

Это ожидаемое поведение. Все функции, назначенные в качестве прослушивателя событий, будут иметь ключевое слово 'this', указывающее на экземпляр элемента, в котором было запущено событие. – marekful

ответ

1

From the docs:

Параметр обработчика принимает функцию обратного вызова ... В обработчика, ключевое слово this относится к элементу DOM, к которому обработчик связан.

5

Это ожидаемое поведение iour. Все функции, назначенные в качестве прослушивателя событий, будут иметь значение this, указывающее на экземпляр элемента, на котором было запущено событие.

Вы можете преодолеть это, используя анонимную функцию обертку, как вы обработчику как:

$("#b").click(function() {foo.bark() }); 
+0

Это странно. Я думал, что 'this' был указателем/ссылкой на объект экземпляра. Как можно перезаписать JQuery? Кроме того, я понимаю, что я могу получить «ожидаемое» поведение, используя эту анонимную функцию, но я не могу понять, как JQuery перезаписывает ключевое слово this. – BlackSheep

+0

'this' не перезаписывается. Вместо этого, когда вы говорите 'elem.onclick = myObj.myfunc', ссылка на' myObj.myFunc' передается 'elem' для использования в качестве обработчика события click. 'myObj.myFunc' затем используется в другом контексте (' elem''s). Где «этот» указывает, определяется контекстом. 'this' всегда доступен только для чтения, и контекст, в котором выполняется функция, определит его. – marekful

2

Это происходит потому, что click передает ссылку на элемент, чтобы это обработчик (который кора в вашем случае)

Когда вы сделаете это:

$("#b").click(function(){ 
    foo.bark(); 
}); 

вы не сможете использовать this ссылаться щелкнул элемент в bark()

+2

Вы можете использовать 'this' в bark(), если вы делаете' $ ('# b'). Click (function() {foo.bark.call (foo);}); ' –

+0

Я думаю, что это противоположность что ОП пытается достичь. – Mathletics

+0

@Mathletics .. Это объяснение, как ОП спросил: «Почему это происходит?» –

-1

Решение проблемы: $.proxy(). Вы можете прочитать больше об этом here

Попробуйте $('#b').on('click', $.proxy(foo.bark, this))

Edit: на самом деле правильный вызов функции прокси-сервера является $.proxy(foo.bark, foo);

+1

'this' там не было бы того, что ожидает OP – epascarello

+0

Ответ будет работать, если у вас есть' $ .proxy (foo.bark, foo) ' – epascarello

+0

Да, вы правы :) Я отредактировал свой ответ – stefanz

Смежные вопросы