Рассмотрим следующий код ... с помощью Hammer.js, но я думаю, что это может быть родовое Javascript вопрос:Доступ «это» от события в прототипе
var drawLayer = new DrawLayer(document.getElementById('canvasContainer'));
function DrawLayer(targetElement) {
this.foo = "bar";
this.gestureDetection = new Hammer.Manager(targetElement);
this.gestureDetection.add(new Hammer.Pan({
direction : Hammer.DIRECTION_ALL,
threshold : 0
}));
this.gestureDetection.add(new Hammer.Press({
time : 0,
threshold : 5
}));
this.gestureDetection.on("press", this.drawBegin);
this.gestureDetection.on("panmove", this.drawMove);
this.gestureDetection.on("panend pressup", this.drawEnd);
this.drawBegin("INIT TEST");
}
DrawLayer.prototype.drawBegin = function (gestureData) {
console.log(typeof(this.foo));
console.log("DRAW BEGIN!");
}
DrawLayer.prototype.drawMove = function (gestureData) {
console.log(this.foo);
console.log("DRAW MOVE!");
}
DrawLayer.prototype.drawEnd = function (gestureData) {
console.log(this.foo);
console.log("DRAW END!");
}
Когда я запускаю его на первый, я получаю это , как и ожидалось:
string
DRAW BEGIN!
Но тогда, когда на самом деле обработки жестов (т.е. когда рисунок материал называется через события), я получаю:
undefined
DRAW BEGIN!
Более того - кажется, что при обработке любого из этих drawBegin/etc. методов, «это» не определено, как будто оно каким-то образом потеряло область видимости?
Мне понравилось бы решение и объяснение. Благодаря!
Значение 'this' определяется ** только ** тем, как вызывается функция. Вместо передачи 'obj.drawMove' непосредственно в функции регистрации обработчика событий передайте анонимную функцию-обертку, которая вызывает' drawMove' через ссылку на объект. – Pointy