通常我在Java上开发,现在我正在研究JavaScript / HTML5 Canvas的东西。从Java开发人员的角度来看,我遇到了一个奇怪的情况。
html页面上有一个html5画布对象,我想在这个画布上跟踪鼠标点击事件。
我声明了类GameBoard
并初始化了它的属性:
function GameBoard() {
// defining a property for GameBoard class instance
this.myProperty = 'some text here';
// getting canvas element
this.boardCanvas = document.getElementById("myCanvas");
// setting the mouse click event listener
this.boardCanvas.addEventListener("mousedown", this.handleMouseClick, false);
}
并且有一个处理鼠标点击事件的类方法:
GameBoard.prototype.handleMouseClick = function(event) {
alert(this.myProperty);
}
handleMouseClick()
将显示undefined
,因为this
方法中的handleMouseClick()
是指HTML5 Canvas实例(boardCanvas)。
我的问题:我如何引用GameBoard
方法中的当前handleMouseClick
类实例来获取类构造函数中定义的myProperty
字段值?
我在这里做错了什么?
谢谢。
答案 0 :(得分:2)
您可以使用bind为功能设置this
this.boardCanvas.addEventListener("mousedown", this.handleMouseClick.bind(this), false);
答案 1 :(得分:1)
其中一个常见惯例是使用this
的别名,通常使用名为self
的变量:
function GameBoard() {
// defining alias
var self = this;
this.myProperty = 'some text here';
this.boardCanvas = document.getElementById("myCanvas");
this.handleMouseClick = function()
{
// using alias
alert(self.myProperty);
};
this.boardCanvas.addEventListener("mousedown", this.handleMouseClick, false);
}
但是,由于您在此处prototype
定义了该方法,因此您可以使用bind
(由@Alexander提议)或尝试此操作:
var self = this;
this.boardCanvas.addEventListener("mousedown", function(e)
{
// calling the function with 'self/this' context
self.handleMouseClick(e);
}, false);
(感谢@Alexander的贡献)