使用';这';在使用jQuery的JavaScript对象中

使用';这';在使用jQuery的JavaScript对象中,javascript,jquery,this,Javascript,Jquery,This,最近,我一直在尝试用JavaScript创建一个具有以下结构的对象: function colorDiv(div){ this.div=div; this.div.bind("click",this.changeColor) this.changeColor(){ this.div.css("background", "#FF0000"); } } 问题是无法从jQuery环境调用changeColor方法,因为此必须引用

最近,我一直在尝试用JavaScript创建一个具有以下结构的对象:

function colorDiv(div){
      this.div=div;
      this.div.bind("click",this.changeColor)
      this.changeColor(){
            this.div.css("background", "#FF0000");
      }
}
问题是无法从jQuery环境调用
changeColor
方法,因为
必须引用当前的
colorDiv
对象,因此绑定方法无法按预期工作。
如何解决这个问题?

有两种方法。最简单的方法如下:

function ColorDiv(div) {
      var that = this;

      that.div = div;
      that.div.bind("click", that.changeColor);

      that.changeColor = function () {
            that.div.css("background", "#FF0000");
      };
}

var colorDiv = new ColorDiv($("#my-div"));
$("#something-else").click(colorDiv.changeColor);
您可以在变量
that
中保存对
this
的引用,该变量正是JavaScript世界中常用的名称。然后在
changeColor
方法中引用
that
而不是
this
。(请注意,我在所有地方都使用了
that
,这只是为了保持一致性,尽管它真正起作用的唯一地方是
changeColor
方法内部。)


另一个是使用这种方法。您可以在每次调用
changeColor
时使用它,如下所示:

var colorDiv = new ColorDiv($("#my-div"));
$("#something-else").click(colorDiv.changeColor.bind(colorDiv));
或者,您可以在
ColorDiv
类中使用它,以确保在调用所有方法时正确绑定它们:

this.changeColor = (function () {
    this.div.css("background", "#FF0000");
}).bind(this);
正如链接文章中所指出的,并非所有浏览器都支持
函数#bind
,因此您需要一个类似于它们提供的垫片,或者可能需要一个垫片

Underline.js的一个函数在这里也很有用,特别是对于多个方法:

_.bindAll(this);

最后,值得注意的是,在您的特定示例中,您实际上不需要执行任何操作:只需执行即可

this.changeColor = function () {
    div.css("background", "#FF0000");
};

而不是您拥有的,即引用传入的
div
变量,而不是存储在
this.div
中的引用,因为它们是相同的东西。

有两种方法。最简单的方法如下:

function ColorDiv(div) {
      var that = this;

      that.div = div;
      that.div.bind("click", that.changeColor);

      that.changeColor = function () {
            that.div.css("background", "#FF0000");
      };
}

var colorDiv = new ColorDiv($("#my-div"));
$("#something-else").click(colorDiv.changeColor);
您可以在变量
that
中保存对
this
的引用,该变量正是JavaScript世界中常用的名称。然后在
changeColor
方法中引用
that
而不是
this
。(请注意,我在所有地方都使用了
that
,这只是为了保持一致性,尽管它真正起作用的唯一地方是
changeColor
方法内部。)


另一个是使用这种方法。您可以在每次调用
changeColor
时使用它,如下所示:

var colorDiv = new ColorDiv($("#my-div"));
$("#something-else").click(colorDiv.changeColor.bind(colorDiv));
或者,您可以在
ColorDiv
类中使用它,以确保在调用所有方法时正确绑定它们:

this.changeColor = (function () {
    this.div.css("background", "#FF0000");
}).bind(this);
正如链接文章中所指出的,并非所有浏览器都支持
函数#bind
,因此您需要一个类似于它们提供的垫片,或者可能需要一个垫片

Underline.js的一个函数在这里也很有用,特别是对于多个方法:

_.bindAll(this);

最后,值得注意的是,在您的特定示例中,您实际上不需要执行任何操作:只需执行即可

this.changeColor = function () {
    div.css("background", "#FF0000");
};

而不是您拥有的,即引用传入的
div
变量,而不是存储在
this.div
中的引用,因为它们是相同的东西。

尝试设置为方法的第一行:

var self = this;
然后根据需要使用self

this.div.bind("click",self.changeColor)

尝试将设置为方法的第一行:

var self = this;
然后根据需要使用self

this.div.bind("click",self.changeColor)

我认为问题在于,如果要使用诸如bind或css之类的jquery方法,则需要在jquery的上下文中执行,即$(div).bind,$(div).csi认为问题在于,如果要使用诸如bind或css之类的jquery方法,则需要在jquery的上下文中执行,即$(div).bind,$(div).cssCareful:虽然
self
不是保留字,但它是引用
窗口
对象的预定义变量。请仔细查看:虽然
self
不是保留字,但它是引用
窗口
对象的预定义变量。谢谢,伙计,我在找绑定函数之类的东西。遗憾的是,它在“不太新”的浏览器中不起作用,但我会尝试一下;)谢谢,伙计,我在找绑定函数之类的东西。遗憾的是,它在“不太新”的浏览器中不起作用,但我会尝试一下;)