保证获取类实例的方法?

时间:2013-01-12 20:54:17

标签: javascript this

我来自C ++,发现“this”仅表示执行上下文。是否有保证获得自我实例的方法?

我问这个是因为我总是试图通过javascript中的“this”获取实例,但是我必须采取各种方式来自己保证,例如描述如下的方式:

MyClass.prototype.OnSomethingHappened = function () {
  // I want to get the reference to the instance of this class.
}

但是这种功能通常被称为:

var bar = new MyClass();
foo.onclick = bar.OnSomethingHappened;

当onclick发生时,会调用OnSomethingHappened,但“this”并不代表bar的实例。

有一些解决方案,如:

var bar = new MyClass();
foo.onclick = function () {
  bar.OnSomethingHappened();
}

是的,它在这里完美运作。 但请考虑:

var bar = new MyClass();
MyClass.prototype.OnSomethingHappened = function () {
  // I want to get the reference to the instance of this class.
}
MyClass.prototype.IWantToBindSomething = function () {
  // sorry for using jquery in a pure javascript question
  $("div#someclass").bind("click", function () {
  bar.OnSomethingHappened();
  });  // I think this is a very very bad practice because it uses a global variable in a class, but I can't think of other workaround, since I have no guaranteed way of getting the instance.
}

1 个答案:

答案 0 :(得分:2)

不,JavaScript中的“类”概念确实不像C ++那样存在。函数和任何特定对象之间没有内在关系。功能只是价值。

(当对象具有引用函数的属性时,除了“随意”关系之外没有任何关系。)

但是,通过将函数包装在使用this.call()的另一个函数中来调用目标函数,可以强制使用.apply()的特定值。你可以在较新的浏览器中使用.bind(),或者只使用匿名(或非匿名)包装器。

编辑 - 了解this的重要之处在于,它的值是完全由调用函数的方式决定,在每个调用点。因此,如果你有一个对象:

var myObj = new Something();

并且您希望使用myObj.handler作为事件处理程序(常见情况),以便事件处理程序中的this引用该对象,您只需要一个包装器:

$('whatever').click( function(ev) { myObj.handler(ev); } );

在该示例中,“myObj”不必是全局变量:

function justAnExample() {
  var myObj = new Something();

  $('whatever').click( function(ev) { myObj.handler(ev); } );
}

您可以清楚地看到“myObj”是“justAnExample”函数中的局部变量。因为JavaScript具有真正的闭包,所以“justAnExample”的调用上下文在调用之后被保留,并且它被作为事件处理程序传递给jQuery的匿名包装函数使用。