附加到未定义事件的原型方法

时间:2016-04-11 18:17:36

标签: javascript addeventlistener prototype-programming

我是Javascript中的OOP新手,我想让我的Slider对象拥有自己的属性和方法。它工作正常,直到我用我的方法slideNextImage添加Eventlistener。触发此方法后,方法内的每个属性都是未定义的。如果我在没有附加任何事件的情况下启动该方法,那么效果很好。

function Slider(photos, currentPhoto){ //Constructor
    this.photos = photos;
    this.currentPhoto = currentPhoto;
}

Slider.prototype.slideNextImage = function () {
    document.getElementById("slider").style.backgroundImage = "url(" + this.photos[this.currentPhoto] + ")";
    console.log("La foto actual es la " + this.currentPhoto + " y en el almacen hay " + this.photos.length);
}

var photos = ["../imagenes/images/wallpaper_5.jpg", "../imagenes/images/wallpaper_4.jpg", "../imagenes/images/wallpaper_3.jpg", "../imagenes/images/wallpaper_2.jpg", "../imagenes/images/wallpaper_1.jpg"];

var slider = new Slider(photos, 0);

document.getElementById("next").addEventListener("click", slider.slideNextImage);

提前谢谢。

2 个答案:

答案 0 :(得分:2)

那是因为'这个'在这种情况下,它不受您真正想要的对象的约束。 (在你的情况下'这个'将被绑定到触发事件的元素)

解决这个问题的一种方法是明确地绑定这个'通过将addEventListener行更改为:

来滑块
document.getElementById("next").addEventListener("click", Slider.prototype.slideNextImage.bind(slider));

答案 1 :(得分:1)

当您作为事件处理程序调用时,您的方法会丢失其上下文(this不再是您的滑块对象)。您有几个选项,最简单的方法是使用Function.prototype.bind

slider.slideNextImage.bind(slider);