我正在尝试将某些JavaScript
功能迁移到OOP JavaScript
,如下所示:
function Test(parameters) {
this.containerID = parameters['containerID'];
....
this.navNext = $('#' + this.containerID + ' #test');
...
}
Test.prototype = {
constructor: Test,
...
init: function () {
...
this.navNext.on('click', function (event) {
...
this.showNext(); //here is the issue
});
...
},
showNext: function () {
...
}
};
然后我实例化如下的新实例:
test = new Test({'containerID':'test_id'});
test.init();
但是当我点击“下一个按钮”或($('#test_id '#test'
元素)时,我收到以下错误:
Uncaught ReferenceError: showNext is not defined
我想在on
jQuery函数this.showNext()
指向选定的元素showNext()
函数,而不是我的原型函数。
有人可以给我一个如何解决这个问题的建议吗?
答案 0 :(得分:2)
在事件处理程序中,this
指的是接收事件的元素。您可以改为对所需的this
进行外部引用。
var that = this;
this.navNext.on('click', function (event) {
...
that.showNext();
});
或者使用Function.prototype.bind()
,可以在较旧的浏览器中进行填充。
this.navNext.on('click', function (event) {
...
this.showNext();
}.bind(this));
或$proxy
。
this.navNext.on('click', $.proxy(function (event) {
...
this.showNext();
}, this));
或者将对象作为事件数据传递。
this.navNext.on('click', this, function (event) {
...
event.data.showNext();
});
请注意,在更改this
的版本中,您仍然可以通过event.currentTarget
获取对该元素的引用。或者只使用event.data
版本,this
仍然是元素。
答案 1 :(得分:1)
查看this
是什么
this.navNext.on('click', function (event) {
console.log(this);
this.showNext(); //here is the issue
});
当你在日志中查看它时,你会看到"这个"是你点击的元素。
范围错误,但您可以使用jQuery's proxy()
进行修复this.navNext.on('click', $.proxy(this.showNext,this));
或者您可以使用Function.prototype.bind()
this.navNext.on('click', this.showNext.bind(this));
答案 2 :(得分:1)
您可以在on('click'
处理程序中保存对象的引用:
var thisRef = this;
this.navNext.on('click', function (event) {
...
thisRef.showNext(); //here is the issue
});