好的,这听起来可能非常简单,但是因为这是我第一次认真学习JavaScript / jQuery,我想知道最好的方法是什么。
所以,情况如下:
var someClass = function()
{
var someProperty;
/*********************************
Initialisation
*********************************/
this.construct = function(options){
this.someProperty = "someValue";
$("#someDiv").click(function(){
// I want to access "this" (= the someClass object) here
});
}
}
var theObj = new someClass();
现在,这就是:鉴于此,在我的特定情况下,theObj
只是一个(全局)对象,我显然可以这样做:
$("#someDiv").click(function(){
console.log(theObj.someProperty);
});
但我绝对不会喜欢它 - 并且必须有更优雅/面向对象的方式。
那么,你会怎么做呢?
答案 0 :(得分:3)
由于您没有使用.prototype
添加方法,而是在类中创建它们作为特权方法,因此只需在构造函数范围内使用引用该对象的其他变量:
var someClass = function() {
var self = this;
...
};
这允许您保留this
引用所单击元素的正常jQuery语义,同时使self
可用于引用包装对象。出于语义保留的原因,我特别建议不要使用.bind(this)
。
关于在回调中使用theObj
的最终提议的“解决方案” - 你也应该永远从内部通过自己的名称引用一个对象,因为这些名称不是在你的控制下,可能会改变。 可能在您当前的代码中是安全的,但它是代码维护和代码隔离的噩梦。
答案 1 :(得分:2)
您可以bind
保持相同的背景:
$("#someDiv").click((function(){
// same this as externally
}).bind(this));
或者你可以在闭包中定义一个变量:
var obj = this;
$("#someDiv").click(function(){
// your this is obj
});
或者如果使用Firefox(以及其他浏览器),您可以使用箭头功能:
$("#someDiv").click(() => {
// same this as externally
});
答案 2 :(得分:2)
有很多方法。你的是一个,它是最简单有效的方法之一,据我所知,它意味着更少的性能惩罚(它使用闭包)。
其他方法:
bind
更改了给定函数范围内this
的含义。如果您执行以下操作,请单击处理程序此关键字将是更高的this
参考:
// This will bind outter "this" as the object referenced by
// inner this
$("#someDiv").click(function(){
console.log(this.someProperty);
}.bind(this));
call
定义了被调用函数中this
的引用。第一个参数是被调用函数作用域中this
引用为this
。下一个参数是可调用的函数参数(如果函数有它们)。 这不适用于点击处理程序用例。
在某些情况下,您可能希望使用call
。例如,如果要以某种自定义方式路由事件,并且事件处理程序接收自定义上下文:
var that = this;
$("#someDiv").click(function(){
// Some handler function from the outter scope. It will have a "this"
// reference to the outter "this" object reference
someHandlerFunction.call(that, { currentElement: this, timeStamp: Date.now() });
});
与call
相同,函数参数在数组中给出,而不是像常规函数调用一样用逗号分隔的实际函数参数。 此外,不适用于您的用例。
首选方法:你的。 bind
/ call
/ apply
方法性能较差,如果您在DOM事件处理程序中使用它会有很大的缺点:您失去了标准this
的含义by DOM - 发起事件的DOM元素的引用 - 。
在其他边缘情况下使用bind,其中this
表示window
JavaScript对象,并且您希望避免闭包方法。
答案 3 :(得分:1)
使用bind
或保存对this
的引用:
$("#someDiv").click((function() {
console.log(this.someProperty);
}).bind(this));
或
var that = this;
$("#someDiv").click((function(){
console.log(that.someProperty);
});