1

我来自 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.
}
4

1 回答 1

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 的匿名包装函数使用。

于 2013-01-12T20:57:51.670 回答