【问题标题】:Dealing with clash between jQuery and Object's "this"处理 jQuery 和 Object 的“this”之间的冲突
【发布时间】:2013-08-15 03:03:51
【问题描述】:

我正在实例化一个创建 DOM 元素并将 jQuery 对象 作为其属性之一的对象,例如:

this.element = $("<div></div>");

我注意到在建立事件时,jQuery 对this 上下文的重写可能会导致问题,例如如果您尝试应用以下内容:

this.element.click(function() {
  this.someObjectMethod();
});

内部 this 现在适用于 DOM 元素,而不是原始对象。为了克服这个问题,我可以做到以下几点:

var _this = this;
this.element.click(function() {
  _this.someObjectMethod();
});

我想知道,这是不好的做法,有没有更好的方法?我查看了一些jQuery docs on apply and call,但我不确定他们是否会在这种情况下提供帮助。

另外,我正在使用Resig's 'simple inheritence 'Class,这可能会对您的答案产生影响。

更新看到$.proxy 的答案,这些似乎是合理的解决方案,但是您将失去引用 DOM 元素的能力。

【问题讨论】:

  • this 分配给另一个变量的做法是标准做法。人们一般使用selfthat作为名字(我更喜欢that作为selfshadowswindow.self
  • @jbabey - 我也见过self 被使用过,虽然我必须承认我发现互换使用这些词有点令人困惑,所以我只是觉得前缀this 对我来说可能更清楚.我喜欢你对that 的建议,可能会采纳!谢谢

标签: jquery oop


【解决方案1】:

你可以使用$.proxy():

this.element.click($.proxy(function() {
    this.someObjectMethod();
}, this));

它返回一个函数,该函数将始终在您在第二个参数中指定的对象的上下文中调用(在我们的例子中,外部this)。

$.proxy() 还强制使用事件处理程序的一种特殊情况:如果您稍后将原始的、未代理的方法传递给off()unbind(),即使您没有直接指定代理处理程序,它也会被透明地删除。

【讨论】:

  • 感谢 Frederic,虽然结果非常相似,然后我失去了对 jQuery 元素的引用。我想知道仅分配对_this 的引用是否比应用jQuery 代理方法更快。
  • @Ian,我不明白您为什么会丢失对 jQuery 对象的引用。当然,它可以作为this.element 使用,因为this 仍然是您的插件对象。
  • 好点@Frederic,但假设你有一个更复杂的 $(".inside", this.element)
  • @Ian,那么你最好多加一个_thisthatself 变量确实:)
  • 这很有用,但我不喜欢您丢失对 DOM 元素的引用这一事实。最后我只是保留了我的原始代码,但我确实知道$.proxy 方法存在并且有一些应用程序:)
猜你喜欢
  • 2012-03-06
  • 2014-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-28
  • 2012-01-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多