jQuery.использование прокси()
Я читал api о jQuery.proxy()
. Это выглядит многообещающе, но мне было интересно, в какой ситуации это лучше использовать. Может кто-нибудь просветить меня?
3 ответа:
когда вы хотите функцию, которая имеет
this
значение, привязанное к определенному объекту. Например, в обратных вызовах, таких как обработчики событий, обратные вызовы AJAX, таймауты, интервалы, пользовательские объекты и т. д.это просто искусственный пример ситуации, когда это может быть полезно. Предполагая, что есть
Person
объект, который имеет имя свойства. Он также связан с элементом ввода текста, и при каждом изменении входного значения имя в этом объекте person обновляется тоже.function Person(el) { this.name = ''; $(el).change(function(event) { // Want to update this.name of the Person object, // but can't because this here refers to the element // that triggered the change event. }); }
одним из решений, которые мы часто используем, является сохранение этого контекста в переменной и использование его внутри функции обратного вызова, такой как:
function Person(el) { this.name = ''; var self = this; // store reference to this $(el).change(function(event) { self.name = this.value; // captures self in a closure }); }
в качестве альтернативы, мы могли бы использовать
jQuery.proxy
вот так Ссылка наthis
относится к объекту человека вместо элемента, который вызвал событие.function Person(el) { this.name = ''; $(el).change(jQuery.proxy(function(event) { this.name = event.target.value; }, this)); }
обратите внимание, что эта функция была стандартизирована в ECMAScript 5, который теперь включает
bind
способ позаимствовано у prototypejs и уже доступен в некоторых браузерах.function Person(el) { this.name = ''; $(el).change(function(event) { this.name = event.target.value; }.bind(this)); // we're binding the function to the object of person }
Это просто сокращенный способ создания контекста для закрытия, например:
$(".myClass").click(function() { setTimeout(function() { alert(this); //window }, 1000); });
как часто мы хотим
this
чтобы остаться таким же, как метод, в котором мы были, который$.proxy()
используется для, Вот так:$("button").click(function() { setTimeout($.proxy(function() { alert(this); //button }, this), 1000); });
он обычно используется для отложенных вызовов или в любом месте, где вы не хотите делать метод longhand объявления закрытия. Строковый метод указания контекста на объект...ну, я еще не сталкивался с практическим использованием в коде every day, но Я уверен, что есть приложения, просто зависит от того, какова ваша структура объекта/события.
например, если вы хотите создать обратные вызовы. Вместо:
var that = this; $('button').click(function() { that.someMethod(); });
вы можете сделать:
$('button').click($.proxy(this.someMethod, this));
или если вы создаете плагин, который принимает вызовы, и вы должны установить определенный контекст для обратного вызова.