在 JavaScript 中(与大多数其他具有相似语法的语言不同),this
完全由函数的调用方式定义,而不是在哪里定义。在您的函数中调用事件处理程序的方式this
并不引用您的对象。
您可以通过三种方式更正它:
如果您的目标是支持 ES5的浏览器或包含 ES5 “shim”,请使用Function#bind
:
var Obj = {
el : document.getElementById,
doSomething : function(){ this.el.property = "value" }
};
Obj.el.addEventListener('click', Obj.doSomething.bind(Obj));
否则,使用闭包:
var Obj = {
el : document.getElementById,
doSomething : function(){ this.el.property = "value" }
};
Obj.el.addEventListener('click', function(event) {
return Obj.doSomething(event);
});
正如 RobG 在评论中指出的那样,因为您只有一个 Obj
对象(而不是具有构造函数或根据需要创建多个对象的东西),您可以只使用其变量 ( Obj
) 来引用该对象,而不是this
:
var Obj = {
el : document.getElementById,
// Obj instead of this ---v
doSomething : function(){ Obj.el.property = "value" }
};
Obj.el.addEventListener('click', Obj.doSomething);
仅当对象在其定义的范围内是一次性的时才有效(对于您的Obj
示例来说是这样)。如果您对它的唯一引用是this
(例如,您没有Obj
),那么您不能这样做并且需要前两个选项之一。
更多的:
但是请注意,您的el
财产是可疑的。您已将其定义为
el : document.getElementById,
...这意味着el
现在指向函数 getElementById
。这可能不是你的本意。大概您的意思el
是指您通过 getElementById
检索到的 DOM 元素,例如:
el : document.getElementById("someIdValue"),
更多在这里。