我来自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.
}
答案 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的匿名包装函数使用。